进程fork和vfork函数复习
2017-11-06 19:59
579 查看
1.fork函数的使用;
fork( )函数的作用是创建一个新的进程。
在应用程序调用fork( )函数后,会创建一个新的进程,称为子进程,原来的进程叫做父进程。从此,运行的已经是两个进程了。
子进程和父进程都可以得到fork函数的返回值。子进程中,fork返回0;父进程中,fork返回子进程的进程号。若创建失败,返回-1.
pid_t fork(void);
功能:创建子进程
fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:
1.在父进程中,fork返回新创建的子进程的PID;
2.在子进程中,fork返回0;
3.如果出现错误,fork返回一个负值
这里重点是上面的黑体部分,案例代码如下:
先来看运行结果:
在上述代码中,只有一个if判断语句,结果确实输出了两条判断值,可见,fork函数的确是被调用一次,却返回两次.
2.父子进程共享代码
在pid=fork()之前,只有一个进程在执行,但在这条语句执行之后,就变成两个进程在执行了,这两个进程的共享代码段,将要执行的下一条语句都是if(pid==0)。两个进程中,原来就存在的那个进程被称作“父进程”,新出现的那个进程被称作“子进程”,父子进程的区别在于进程标识符(PID)不同。
示例代码:
返回结果如下:
这里,代码上面只有一个printf,但是却输出了两边count值,可见,父子进程共享代码片段,但是,子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享。.
3.vfork函数
fork:子进程拷贝父进程的数据段
vfork:子进程与父进程共享数据段
fork:父、子进程的执行次序不确定
vfork:子进程先运行,父进程后运行
示例代码:
输出如下:
fork( )函数的作用是创建一个新的进程。
在应用程序调用fork( )函数后,会创建一个新的进程,称为子进程,原来的进程叫做父进程。从此,运行的已经是两个进程了。
子进程和父进程都可以得到fork函数的返回值。子进程中,fork返回0;父进程中,fork返回子进程的进程号。若创建失败,返回-1.
pid_t fork(void);
功能:创建子进程
fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:
1.在父进程中,fork返回新创建的子进程的PID;
2.在子进程中,fork返回0;
3.如果出现错误,fork返回一个负值
这里重点是上面的黑体部分,案例代码如下:
#include <sys/types.h> #include <unistd.h> main() { pid_t pid; //pid_t是一个宏定义,其数据类型为unsigned int /*此时仅有一个进程*/ pid=fork(); /*此时已经有两个进程在同时运行*/ if(pid<0) printf("error in fork!"); else if(pid==0) printf("I am the child process, ID is %d\n",getpid()); else printf("I am the parent process,ID is %d\n",getpid()); }
先来看运行结果:
~/LinuxC$ ./createProgress I am the parent process,ID is 3186 I am the child process, ID is 3187
在上述代码中,只有一个if判断语句,结果确实输出了两条判断值,可见,fork函数的确是被调用一次,却返回两次.
2.父子进程共享代码
在pid=fork()之前,只有一个进程在执行,但在这条语句执行之后,就变成两个进程在执行了,这两个进程的共享代码段,将要执行的下一条语句都是if(pid==0)。两个进程中,原来就存在的那个进程被称作“父进程”,新出现的那个进程被称作“子进程”,父子进程的区别在于进程标识符(PID)不同。
示例代码:
#include <unistd.h> #include <stdio.h> int main(void) { pid_t pid; int count=0; pid = fork(); count++; printf( “count = %d\n", count ); return 0; }
返回结果如下:
wulongjian@wulongjian-Inspiron-5557:~/LinuxC$ ./createProgress2 count = 1 count = 1
这里,代码上面只有一个printf,但是却输出了两边count值,可见,父子进程共享代码片段,但是,子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享。.
3.vfork函数
fork:子进程拷贝父进程的数据段
vfork:子进程与父进程共享数据段
fork:父、子进程的执行次序不确定
vfork:子进程先运行,父进程后运行
示例代码:
# include <unistd.h> # include <stdio.h> int main(void) { pid_t pid; int count=0; pid = vfork(); count++; printf( “count = %d\n", count ); _exit(0);//这里要加退出函数,不然父进程会一直阻塞,程序报错. return 0; }
输出如下:
count=1 count=2
相关文章推荐
- 进程创建函数fork()、vfork()
- 4进程原语:fork()函数,getpid()函数和getppid()函数,getuid()函数,getgid()函数,vfork()
- 进程创建函数fork()、vfork() ,以及excel()函数
- linux c之创建进程fork和vfork函数之间的区别
- 进程创建函数fork和vfork的区别
- 进程学习(一)——fork()和vfork()函数学习过程
- Linux下fork()&vfork()的区别、getenv()&setenv()函数以及僵尸进程、孤儿进程讲解
- 浅谈进程的创建函数fork及vfork
- 进程控制之fork()与vfork()函数
- 深入解读Linux进程函数fork(),vfork(),execX()
- 进程原语:fork()函数,getpid()函数和getppid()函数,getuid()函数,getgid()函数,vfork()
- 进程创建函数fork和vfork的区别
- vfork()函数和fork()函数实现子进程的异同
- 进程创建函数fork与vfork
- 进程创建函数fork()、vfork() ,以及excel()函数
- Linux进程函数fork(),vfork(),execX()的深入理解
- 函数fork和vfork
- 进程操作函数:fork.execl的应用—对文件进行的修改进行自动备份
- UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习
- linux的fork()函数-进程控制