关于fork创建进程问题,求高手指教!!!!

C、C++和Java语言
回复
yangkang0831
帖子: 5
注册时间: 2010-11-13 20:43
送出感谢: 0
接收感谢: 0

关于fork创建进程问题,求高手指教!!!!

#1

帖子 yangkang0831 » 2010-12-28 17:52

源程序如下:
#include"stdio.h"
#include"stdlib.h" //exit包含在stdlib.h头文件中
#include"unistd.h"
int main(void)
{
pid_t pid;
pid=fork();
switch(pid)
{
case 0:
printf("Child process is running,CurPid is %d,ParentPid is %d\n",pid,getppid());
printf("\n%d,%d\n",pid,getpid());
break;
case -1:
perror("Process creation failed\n");
break;
default:
printf("Parent process is running,ChildPid is %d,ParentPid is %d\n",pid,getpid());
break;
}
exit(0);
}
输出结果如下:
Parent process is running,ChildPid is 4517,ParentPid is 4516
Child process is running,CurPid is 0,ParentPid is 4516

0,4517
(具体的ID号可能不同)

有几个问题:
1.程序中的printf("\n%d,%d\n",pid,getpid());中pid和getpid有什么区别?
2.fork有两个返回值,一个算父进程调用fork函数后的返回值,一个是子进程调用fork函数的返回值(创建成功则为0),那语句pid=fork();有没有问题?返回值的顺序是什么?
3.我觉得这个程序中父进程的ID号是4516,子进程的ID号是4517,可是语句printf("\n%d,%d\n",pid,getpid());的输出结果为什么是0,4517?
4.程序执行的时候先输出父进程中的消息还是先输出子进程中的消息?这个我也不是很明白

因为本人是个初学者,还望各位大虾能多多指教,不甚感激!!!!
huangyun
帖子: 49
注册时间: 2006-11-27 14:21
送出感谢: 0
接收感谢: 0
联系:

Re: 关于fork创建进程问题,求高手指教!!!!

#2

帖子 huangyun » 2010-12-29 9:36

你man fork就知道了,这个函数调用一次返回两次,一次返回给父进程,一次返回给子进程,通过返回值来区别哪个是哪个。返回给父进程的值是子进程的pid;返回给子进程的值是0;当然如果出错了就返回给父进程-1,并且没有子进程被创建。

再回答你的问题:
1: getpid函数返回当前进程的pid,对父进程来说,pid变量是子进程的id号,getpid返回的是自己的pid(也就是父进程的id);对于子进程来说,pid是0(还记得前面说的fork返回值吗?),getpid返回的是自己的pid(也就是子进程的id)。从你都输出来看是正确的,
Parent process is running,ChildPid is 4517 (getpid的返回值,子进程id) ,ParentPid is 4516 (父进程id)
Child process is running,CurPid is 0 (getpid的返回值,0) ,ParentPid is 4516 (子进程id)

2:在前面已经解释过了。至于返回之后那个进程先运行是不确定的,取决于系统都实现。

3:前面已经解释了

4:同问题2的解答,不一定谁先输出。
yangkang0831
帖子: 5
注册时间: 2010-11-13 20:43
送出感谢: 0
接收感谢: 0

Re: 关于fork创建进程问题,求高手指教!!!!

#3

帖子 yangkang0831 » 2010-12-29 10:09

huangyun 写了:你man fork就知道了,这个函数调用一次返回两次,一次返回给父进程,一次返回给子进程,通过返回值来区别哪个是哪个。返回给父进程的值是子进程的pid;返回给子进程的值是0;当然如果出错了就返回给父进程-1,并且没有子进程被创建。

再回答你的问题:
1: getpid函数返回当前进程的pid,对父进程来说,pid变量是子进程的id号,getpid返回的是自己的pid(也就是父进程的id);对于子进程来说,pid是0(还记得前面说的fork返回值吗?),getpid返回的是自己的pid(也就是子进程的id)。从你都输出来看是正确的,
Parent process is running,ChildPid is 4517 (getpid的返回值,子进程id) ,ParentPid is 4516 (父进程id)
Child process is running,CurPid is 0 (getpid的返回值,0) ,ParentPid is 4516 (子进程id)

2:在前面已经解释过了。至于返回之后那个进程先运行是不确定的,取决于系统都实现。

3:前面已经解释了

4:同问题2的解答,不一定谁先输出。
非常感谢你的回答,我在创建进程的时候还碰到了个问题,就是我想一父进程创建两个子进程,我用了下面的源代码:
#include"stdio.h"
#include"stdlib.h" //exit包含在stdlib.h头文件中
#include"unistd.h"
int main(void)
{
pid_t pid1,pid2;
pid1=fork();
switch(pid1)
{
case 0: //进程创建成功,返回值为0
printf("b"); //子进程1创建成功,输出b
break;
case -1:
printf("Process creation failed\n");//子进程创建失败,输出错误信息
break;
default:
printf("a");//此时执行父进程,输出a
sleep(1);
break;
}
pid2=fork();
switch(pid2)
{
case 0: //进程创建成功,返回值为0
printf("c"); //子进程2创建成功,输出c
break;
case -1:
printf("Process creation failed\n");//子进程创建失败,输出错误信息
break;
default:
printf("a");//此时执行父进程,输出a
//sleep(1);
break;
}
exit(0);
}

我希望输出的结果是abc或者bac等,但结果好像输出了好多东西,我想知道错的原因,谢谢。
huangyun
帖子: 49
注册时间: 2006-11-27 14:21
送出感谢: 0
接收感谢: 0
联系:

Re: 关于fork创建进程问题,求高手指教!!!!

#4

帖子 huangyun » 2010-12-29 15:22

你还是没有理解fork的原理,''fork''这个词都意思是分叉,就是创建一个子进程,子进程的进程空间是从父进程的进程空间复制得到的,也就是说后续的代码父进程和子进程都会执行。例如:

代码: 全选

pid = fork();
// 注意从这以后的代码父子进程都执行
cout<<"both processes print this line"<<endl;
if (pid == 0)
{
   // 这里的代码只有子进程执行,因为fork给子进程的返回值是0,给父进程的返回值不是0
   cout<<"only child process print this line"<<endl;
}
else
{
   // 这里的代码只有父进程执行,因为fork给子进程的返回值是0,给父进程的返回值不是0
   cout<<"only parent process print this line"<<endl;
}
cout<<"again, both processes print this line"<<endl;
huangyun
帖子: 49
注册时间: 2006-11-27 14:21
送出感谢: 0
接收感谢: 0
联系:

Re: 关于fork创建进程问题,求高手指教!!!!

#5

帖子 huangyun » 2010-12-29 15:25

对于你的问题,如果要创建两个子进程,那得这么写:

代码: 全选

pid1 = fork();
if (pid1 == 0)
{
   //  第一个子进程的代码
}
else
{
    //  父进程,刚刚创建完一个子进程,现在创建第二个
    pid2 = fork();
    if (pid2 == 0)
    {
        // 第二个子进程的代码
    }
    else
   {
         //  父进程其他的代码
   }
}
huangyun
帖子: 49
注册时间: 2006-11-27 14:21
送出感谢: 0
接收感谢: 0
联系:

Re: 关于fork创建进程问题,求高手指教!!!!

#6

帖子 huangyun » 2010-12-29 15:27

你的代码错在第一个创建的子进程也会执行第二个fork,于是系统里面有4个进程:最初的进程(父进程),第一个子进程,第一个子进程创建的子进程,父进程创建的第二个子进程。
yangkang0831
帖子: 5
注册时间: 2010-11-13 20:43
送出感谢: 0
接收感谢: 0

Re: 关于fork创建进程问题,求高手指教!!!!

#7

帖子 yangkang0831 » 2010-12-29 20:42

huangyun 写了:你的代码错在第一个创建的子进程也会执行第二个fork,于是系统里面有4个进程:最初的进程(父进程),第一个子进程,第一个子进程创建的子进程,父进程创建的第二个子进程。
现在明白了,谢谢!辛苦了!
头像
ouch_ouch
帖子: 217
注册时间: 2010-12-24 19:52
送出感谢: 0
接收感谢: 0

Re: 关于fork创建进程问题,求高手指教!!!!

#8

帖子 ouch_ouch » 2011-02-13 15:50

看到5楼,我就没话说了,很好滴解释 :em06
顶人一帖,胜造七级浮屠。。。
eagle_wang
帖子: 1
注册时间: 2012-02-12 9:21
送出感谢: 0
接收感谢: 0

Re: 关于fork创建进程问题,求高手指教!!!!

#9

帖子 eagle_wang » 2012-02-12 9:31

学习中…… 顺便指出点小问题:2楼大神应该是没注意吧,楼主1楼程序中其实子进程中用的函数是getppid():是获得父进程ID,所以2楼中标注错了一点
Child process is running,CurPid is 0 ,ParentPid is 4516 (程序中用的getppid,这个是父进程id)…
都知道怎么回事,我费点事指出而已,省的别真有理解错的……
回复

回到 “C/C++/Java”