这一章呢我们来了解下另一个能够创建进程的函数:vfork函数。
vfork函数的作用基本和fork函数类似,调用流程和返回值与fork函数完全相同。
那么fork和vfork有什么区别呢?
我们来看一下下面这几段程序:
我们可以从中看到:
1、 vfork创建的子进程会先运行,可以说子进程和附近陈的结果是确定的,fork先运行那个不能确定
2、 vfork创建的进程中父进程和子进程共享了全部变量(k)和局部变量(i)的数据
3、 因为vfork是子进程先运行,父进程挂起,可以看到直至子进程调用exec或则exit之后父子进程的执行次序不再有限制,因此,如果在子进程调用exec或exit之前需要父进程的进一步活动,就会造成死锁
4、 可以看到在不调用exec或exit时,局部变量在父进程中会出现不可预料的结果
5、 在子进程调用了exec或exit后,子进程后面的代码并没有运行
leave@LEAVE:~/test$ more 1.c#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE * fp
if (NULL == (fp=fopen("./hhh.txt", "rb")))
{
return 0
}
while(!feof(fp))
{
char linebuf[256] = ""
char * pstr
int ret = 0
if (NULL == (pstr=fgets(linebuf, sizeof(linebuf), fp)))
break
pstr += strspn(pstr, "\t\x20\n\r")// jump over space
if ('\0' == *pstr ) // jump over blank line
continue
if('0' <= *pstr &&'9' >= *pstr)
{
printf("%s\n", strtok(pstr,":") )
}
}
return 0
}
leave@LEAVE:~/test$ gcc -o 1 1.c
leave@LEAVE:~/test$ ./1
12
124
125
128
321
324
345
456
465
478
789
leave@LEAVE:~/test$
不应该啊!怎么还一直打印******* 呢?可能子进程通过return 0后没有结束,而是重新开始运行了。可能是vfork的机制造成的吧。
刚看了下百科里的介绍。这个果然是vfork的机制导致的。因为vfork保证子进程先运行,而且要子进程结束后才继续运行父进程。如果子进程没有exit或者exec,那么就会一直fork下去导致出现很多进程。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)