进程fork和vfork函数复习
来源:互联网 发布:卷皮折扣和淘宝那个好 编辑:程序博客网 时间:2024/06/10 07:26
1.fork函数的使用;
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());elseprintf("I am the parent process,ID is %d\n",getpid());}
先来看运行结果:
~/LinuxC$ ./createProgress I am the parent process,ID is 3186I 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$ ./createProgress2count = 1count = 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=1count=2
- 进程fork和vfork函数复习
- 进程创建函数之fork()和vfork()
- 函数fork和vfork
- fork和vfork函数
- 进程创建函数fork()、vfork()
- Unix进程控制之1---fork和vfork函数
- Linux多进程之fork()和vfork()函数的对比
- Linux创建进程fork和vfork函数分析
- 进程创建函数fork和vfork的区别
- 进程创建函数fork和vfork的区别
- fork和vfork函数介绍
- 进程控制1--fork vfork函数
- 进程控制1--fork vfork函数
- 进程创建函数fork与vfork
- 4进程原语:fork()函数,getpid()函数和getppid()函数,getuid()函数,getgid()函数,vfork()
- 进程原语:fork()函数,getpid()函数和getppid()函数,getuid()函数,getgid()函数,vfork()
- 通过fork、vfork和clone创建进程
- 【Linux】进程的创建fork()和vfork()
- netty对http协议解析原理解析
- 【减治法】插入排序及C++代码实现
- 基础练习 完美的代价(蓝桥杯 字符串问题)
- cygwin工具安装使用
- 最少货币数问题
- 进程fork和vfork函数复习
- Dialvik/ARP(ANDROID)中的多线程机制(3)
- js对象、继承,原型链相关知识及应用心得
- Yii2 中模块相关配置
- codeforces672 A (数字转换成字符串)
- 顺序结构的队列
- 220. Contains Duplicate III
- eclipse 启动报错问题,整理could not create java virtual machine a fatal exception has occured
- tensorflow 安装中遇到的问题