LINUX 进程编程

问一下我用vfork()这个函数为什么编译之后出来3个结果2个子进程号一个父进程号这是什么情况#include<stdio.h>#include<sys/types.h>... 问一下我用vfork()这个函数 为什么编译之后出来3个结果 2个子进程号 一个父进程号 这是什么情况
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main ()
{
pid_t p;
p = vfork();
if(p>0)
printf("the parent ID is %d\n",getpid());
if(p==0)
printf("the child ID is %d\n",getpid());
}
展开
 我来答
蛋蛋的苍穹之下
2013-12-05 · TA获得超过159个赞
知道小有建树答主
回答量:220
采纳率:0%
帮助的人:128万
展开全部
第一眼觉着没啥难度的问题,看了看还是挺纠结的。Linux 的 man 手册上有写到:

vfork() is a special case of clone(2). It is used to create new processes without copying the page tables of the parent process. It may be useful in performance-sensitive applications where a child is created which then immediately issues an execve(2).

vfork() differs from fork(2) in that the calling thread is suspended until the child terminates (either normally, by calling _exit(2), or abnormally, after delivery of a fatal signal), or it makes a call to execve(2). Until that point, the child shares all memory with its parent, including the stack. The child must not return from the current function or call exit(3), but may call _exit(2).

结合wiki上的,简单说,vfork创建了一个轻量级进程(LWP),但是它并不将父进程的地址空间完全复制到子进程中,不会复制页表。在子进程调用exec或exit之前,他在父进程的空间中运行;在子进程调用exec或exit之前,父进程阻塞。

至于重复两次子进程,当没有return语句时,你的main会被返回一个0(当然是在程序最后自动添加上去的了~~)。所以,你等于子进程没有调用exit而是return。

对于exit与return,要这么理解——exit让整个进程直接终止;return返回入口点(调用点)。你这里没有用exit而使用了return,return 0在一个函数中是正常的返回过程,它会使得程序返回到函数被调用处,回复之前的执行流程,return 语句不会被执行。

至于答案中有出现的 孤儿进程 和 守护进程——vfork机制下,父进程绝对 “不会比子进程早结束”!!!(如果你不嫌之前的分析太长而仔细看完过的话,不难理解这个)。这完全没有孤儿进程的事情好不好~~
匿名用户
2013-12-04
展开全部
vfork用于创建一个新进程,而且该新进程的目的是为了执行exec,如果子进程没有执行exec或者exit函数,则会出现很多未知的问题.
我在ubuntu 10.04上执行的结果如下:
the child ID is 28831
the parent ID is 28830
vfork: cxa_atexit.c:99: __new_exitfn: Assertion `l != ((void *)0)' failed.
Aborted
而在子进程中执行exit后,结果如下:
the child ID is 28842
the parent ID is 28841
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友de32a0e
2013-12-05 · TA获得超过241个赞
知道小有建树答主
回答量:74
采纳率:0%
帮助的人:64.5万
展开全部
你函数编写有问题,忘记最后加return 0了。这是个不好的习惯。vfork是个有争议的函数,最好不用,也很少人用,最初也只是为exec()函数族运行快速而设计。至于为什么会有两个子进程号,需要学习了精灵进程和孤儿收留机制才能理解。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式