第五十七章、linux中除了fork外还能用什么函数创建进程

第五十七章、linux中除了fork外还能用什么函数创建进程,第1张

上一章我们用fork函数创建了进程,也了解了进程的一些知识

这一章呢我们来了解下另一个能够创建进程的函数: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下去导致出现很多进程。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7535701.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存