当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 关于fork创建进程问题,求高手指教!!!!
帖子发表于 : 2010-12-28 17:52 

注册: 2010-11-13 20:43
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
源程序如下:
#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.程序执行的时候先输出父进程中的消息还是先输出子进程中的消息?这个我也不是很明白

因为本人是个初学者,还望各位大虾能多多指教,不甚感激!!!!


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 关于fork创建进程问题,求高手指教!!!!
帖子发表于 : 2010-12-29 9:36 

注册: 2006-11-27 14:21
帖子: 49
送出感谢: 0 次
接收感谢: 0 次
你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的解答,不一定谁先输出。


_________________
我的百度空间: http://hi.baidu.com/huangyunict/
我的个人主页:http://www.comp.nus.edu.sg/~huangyun/


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 关于fork创建进程问题,求高手指教!!!!
帖子发表于 : 2010-12-29 10:09 

注册: 2010-11-13 20:43
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
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等,但结果好像输出了好多东西,我想知道错的原因,谢谢。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 关于fork创建进程问题,求高手指教!!!!
帖子发表于 : 2010-12-29 15:22 

注册: 2006-11-27 14:21
帖子: 49
送出感谢: 0 次
接收感谢: 0 次
你还是没有理解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;


_________________
我的百度空间: http://hi.baidu.com/huangyunict/
我的个人主页:http://www.comp.nus.edu.sg/~huangyun/


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 关于fork创建进程问题,求高手指教!!!!
帖子发表于 : 2010-12-29 15:25 

注册: 2006-11-27 14:21
帖子: 49
送出感谢: 0 次
接收感谢: 0 次
对于你的问题,如果要创建两个子进程,那得这么写:
代码:
pid1 = fork();
if (pid1 == 0)
{
   //  第一个子进程的代码
}
else
{
    //  父进程,刚刚创建完一个子进程,现在创建第二个
    pid2 = fork();
    if (pid2 == 0)
    {
        // 第二个子进程的代码
    }
    else
   {
         //  父进程其他的代码
   }
}


_________________
我的百度空间: http://hi.baidu.com/huangyunict/
我的个人主页:http://www.comp.nus.edu.sg/~huangyun/


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 关于fork创建进程问题,求高手指教!!!!
帖子发表于 : 2010-12-29 15:27 

注册: 2006-11-27 14:21
帖子: 49
送出感谢: 0 次
接收感谢: 0 次
你的代码错在第一个创建的子进程也会执行第二个fork,于是系统里面有4个进程:最初的进程(父进程),第一个子进程,第一个子进程创建的子进程,父进程创建的第二个子进程。


_________________
我的百度空间: http://hi.baidu.com/huangyunict/
我的个人主页:http://www.comp.nus.edu.sg/~huangyun/


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 关于fork创建进程问题,求高手指教!!!!
帖子发表于 : 2010-12-29 20:42 

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


现在明白了,谢谢!辛苦了!


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 关于fork创建进程问题,求高手指教!!!!
帖子发表于 : 2011-02-13 15:50 
头像

注册: 2010-12-24 19:52
帖子: 217
送出感谢: 0 次
接收感谢: 0 次
看到5楼,我就没话说了,很好滴解释 :em06


_________________
顶人一帖,胜造七级浮屠。。。


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 关于fork创建进程问题,求高手指教!!!!
帖子发表于 : 2012-02-12 9:31 

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


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译