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());
} 展开
#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());
} 展开
3个回答
展开全部
第一眼觉着没啥难度的问题,看了看还是挺纠结的。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机制下,父进程绝对 “不会比子进程早结束”!!!(如果你不嫌之前的分析太长而仔细看完过的话,不难理解这个)。这完全没有孤儿进程的事情好不好~~
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
我在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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你函数编写有问题,忘记最后加return 0了。这是个不好的习惯。vfork是个有争议的函数,最好不用,也很少人用,最初也只是为exec()函数族运行快速而设计。至于为什么会有两个子进程号,需要学习了精灵进程和孤儿收留机制才能理解。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询