今天练习进程调度,顺带写下个人对fork和vfork的见解,如有不妥之处,还请指点一二。
fork和vfork的相同点:被调用一次,却返回两次,可能有三种不同的返回值。
1.在父进程,返回子进程的PID。
2.在子进程,返回0。
3.若异常,返回一个负值。
fork和vfork的区别:1.fork创建子进程后,接下来运行子进程或者父进程的顺序是随机的。
vfork则永远先运行子进程,再运行父进程。
2.fork子进程拷贝父进程的数据段。
vfork子进程共享父进程的数据段。
关于区别的第二点,贴出简单代码如下:
调用fork示例:
#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;
}
解释:printf打印语句先后由父子进程执行,所以将会打印两条信息。由于fork创建的子进程会拷贝父进程的代码段,即使count变量先后在父子进程执行加1操作,但是由于父子进程的数据段是分离的,所以最终输出应该是:
count = 1
count = 1
调用vfork示例:
#include <unistd.h>
#include <stdio.h>
int main(void)
{
pid_t pid;
int count = 0;
pid = vfork();
count++;
printf("count = %d/n", count);
return 0;
}
解释:vfork方式,数据段是共享的,所以输出是:
count = 1
count = 2