fork,vfork
转自 http://blog.csdn.net/todd911/article/details/14062103
1.fork函数
一个现有的进程可以调用fork函数创建一个新的子进程。
#include <unitsd.h>
pid_t fork(void); //子进程返回0,父进程返回子进程ID,出错返回-1。
关于fork函数的常规用法这边不说了,下面说明下父子进程的文件共享。子进程是父进程的副本,例如,子进程获得父进程数据空间、栈和堆的副本,这是子进程所拥有的副本,父子进程并不共享这些存储空间部分。由于在fork之后经常跟随着exec,所以现在的很多实现并不执行一个父进程数据段、栈和堆的完全复制,作为替代,使用了写时复制(copy on write,COW)技术。
一个进程具有三个不同的打开文件,它们是标准输入,标准输出和标准出错,从fork返回时,我们有了下面的结构。
这种共享文件的方式使父子进程对同一文件使用了一个文件偏移量,如果父子进程都向标准输出进行写操作,如果父进程的标准输出已经重定向,那么子进程写到标准输出时,它将更新与父进程共享的该文件的偏移量。比如当父进程等待子进程时,子进程写到标准输出,而在子进程终止后,父进程也写到标准输出,并且其输出会添加在子进程所写数据之后,如果父子进程不共享同一文件偏移量,这种形式的交互很难实现。
除了打开文件之外,父进程的很多其他属性也由子进程继承,包括:
- 实际用户ID,实际组ID,有效用户ID,有效组ID。
- 附加组ID。
- 进程组ID。
- session ID。
- 控制终端。
- 设置用户ID标志和设置组ID标志。
- 当前工作目录。
- 根目录。
- 文件模式创建屏蔽字。
- 信号屏蔽和安排。
- 针对任意开打文件描述符的在执行时关闭(close-on-exec)标志。
- 环境。
- 连接的共享存储段。
- 资源映射。
- 资源限制。
- fork返回值。
- 进程ID不同。
- 两个进程具有不同的父进程ID。
- 子进程的tms_utime,tms_stime,tms_cutime以及tms_ustime均设置为0.
- 父进程设置的文件锁不会被子进程继承。
- 子进程的未处理alarm被清除。
- 子进程的未处理信号设置为空集。
#include <stdio.h>
#include <unistd.h>
int g_a = ;
int main(void){
int l_b = ;
pid_t p;
if((p = fork()) < ){
perror("fork");
}else if(p == ){
g_a++;
l_b++;
}
printf("pid = %d,g_a = %d,l_b = %d\n", getpid(), g_a, l_b);
return ;
}
pid = 15869,g_a = 2,l_b = 2
pid = 15868,g_a = 1,l_b = 1
[yan@yanPC apue]$ ./a.out
pid = 15870,g_a = 1,l_b = 1
pid = 15871,g_a = 2,l_b = 2
2.vfork函数
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> int g_a = ; int main(void){
int l_b = ;
pid_t p;
if((p = vfork()) < ){
perror("fork");
}else if(p == ){
g_a++;
l_b++;
}
printf("ppid = %d,pid = %d,g_a = %d,l_b = %d\n", getppid(), getpid(), g_a, l_b);
return ;
}
ppid = 16090,pid = 16091,g_a = 2,l_b = 2
ppid = 15773,pid = 16090,g_a = 2,l_b = 3908224
Segmentation fault
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> int g_a = ; int main(void){
int l_b = ;
pid_t p;
if((p = vfork()) < ){
perror("fork");
}else if(p == ){
g_a++;
l_b++;
_exit(); //为什么现在好了??
}
printf("ppid = %d,pid = %d,g_a = %d,l_b = %d\n", getppid(), getpid(), g_a, l_b);
return ;
}
child terminates (either normally, by calling _exit(2), or abnormally,
after delivery of a fatal signal), or it makes a call to execve(2).
Until that point, the child shares all memory with its parent, includ‐
ing the stack. The child must not return from the current function or
call exit(3), but may call _exit(2).
fork,vfork的更多相关文章
- UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid
本章包含内容有: 创建新进程 程序执行(program execution) 进程终止(process termination) 进程的各种ID 1 进程标识符(Process Identifie ...
- Linux进程理解与实践(一)基本概念和编程概述(fork,vfork,cow)
进程 and 程序 什么是程序? 程序是完成特定任务的一系列指令集合. 什么是进程? [1]从用户的角度来看:进程是程序的一次执行过程 [2]从操作系统的核心来看:进程是操作系统分配的内存.CPU时间 ...
- linux 进程创建clone、fork与vfork
目录: 1.clone.fork与vfork介绍 2.fork说明 3.vfork说明 4.clone说明5.fork,vfork,clone的区别 内容: 1.clone.fork与vfork介绍 ...
- fork与vfork区别
1. 地址空间各段拷贝: fork: 内核为子进程生成新的地址空间结构,拷贝父进程的代码段,数据空间,堆,栈到自身的地址空间,但注意:子进程的代码段并不会分配物理空间,而是指向父进程的代码段物理空间, ...
- fork()和vfork()的区别(转载)
fork和vfork 转载 http://coolshell.cn/articles/12103.html 在知乎上,有个人问了这样的一个问题--为什么vfork的子进程里用return,整个程序会挂 ...
- c语言exit和return区别,在fork和vfork中使用
转自c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: ...
- 进程控制fork vfork,父子进程,vfork保证子进程先运行
主要函数: fork 用于创建一个新进程 exit 用于终止进程 exec 用于执行一个程序 wait 将父进程挂起,等待子进程结束 getpid 获取当前进程的进程ID nice 改变进程的优先级 ...
- fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结
一:fork()和vfork()的区别: fork()函数可以创建子进程,有两个返回值,即调用一次返回两个值,一个是父进程调用fork()后的返回值,该返回值是刚刚创建的子进程的ID;另一个是子 ...
- fork与vfork
先看一个fork的例子: ; int main(void) { int var, pid; ; ) { printf("vfork error"); exit(-); } ) { ...
随机推荐
- jq 简单实现 table 显示和隐藏
在做table显示和隐藏的时候,需要用到节点的问题.不要用id.循环的时候id都是一样的. 这样一个简单的tr显示和隐藏就实现了.也可以将click 换成别的事件.
- VS 发布MVC网站缺少视图
mvc项目发布之后会有一些视图文件缺少,不包含在发布文件中,虽然可以直接从项目文件中直接拷贝过来,但还是想知道是什么原因,发布文件好像没有找到哪里有设置这个的地方 把生成操作:无-改成内容即可 原文
- Computer Networking: A Top Down Approach
目录 Chapter 1: Computer Networks and the Internet 1. What is the Internet? 2. The Network Edge 3. The ...
- 标记重要和强调的文本 strong & em
strong元素表示内容的重要性,而em则表示内容的着重点. 根据内容需要,这两个元素既可以单独使用,也可以一起使用. 例如: ... <body> <p><strong ...
- jmeter-Unable to access jarfile ApacheJMeter.jar
jmeter在运行时报错Unable to access jarfile ApacheJMeter.jar.如下图: 检查后发现jmeter_home/bin/目录下缺失 ApacheJMeter.j ...
- python json dumps与loads
json.dumps() 是将一个Python数据结构转换为一个JSON编码的字符串 json.loads() 是将一个JSON编码的字符串转换为一个Python数据结构 一般要求当要字符串通过l ...
- Linux系统禁止root账号远程登录
修改配置文件/etc/ssh/sshd_config,去掉PermitRootLogin前的注释,修改值为no,然后重启sshd服务即可 #LoginGraceTime 2m PermitRootLo ...
- Odoo graph视图
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826175.html 一:图形视图 图形视图用来表示对模型的概述和分析,根元素是<graph> ...
- 内核中dump_stack的实现原理(2) —— symbol
环境 Linux-4.14 Aarch64 正文 在前面的分析中调用print_symbol("PC is at %s\n", instruction_pointer(regs ...
- SaltStack--使用salt-ssh
SaltStack使用salt-ssh模式 salt-ssh 介绍 参考官档 salt-ssh是 0.17.0 新引入的一个功能,不需要minion对客户端进行管理,也可以不需要master:salt ...