• 全部
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux
  • 问答

关于fork()函数的一点疑惑!

Minary 2002-12-19 10:31:44
我在阅读《进程间通信》。文中有这样一个例程。
#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
void main(void)
{ printf("Hello!");
fork();
printf("Bye!");
}
为何结果会打出两遍Bye! ?
到底何为一个进程?是上面的一整个程序,还是一个库函数就算?
多谢指教!
...全文
89 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sans 2002-12-19
是的,算一个进程。
回复
Minary 2002-12-19
一个经过编译,连接的源程序在运行后就可以算作一个进程了吧?!
回复
sans 2002-12-19
调用库函数不算,必须要fork才算
或者使用线程,pthread
回复
Minary 2002-12-19
还有,调用一个库函数,也算是一个进程吗?
回复
sans 2002-12-19
执行fork后,子进程从fork后面的语句执行起,于是显示bye,再加上父进程的bye,故此有两个。
回复
ztlxx 2002-12-19
看一看操作系统吧
回复
IEQQ 2002-12-19
fork( )执行后,会自动复制当前的程序,并且从fork后的语句执行

请看批注:

#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
void main(void)
{ printf("Hello!");
fork(); //开辟一个子进程, 复制了一个可以与后继程序并发执行的
//程序段 printf("bye!");
printf("Bye!");
}

下面是一个我当年遇到的问题,以及其他兄弟给我 的答复,你可以参考.

该程序在Linux gcc下运行
fork( )在运行态下返回0,在成功创建情况下返回PID,创建失败返回-1

#include <stdio.h>

main( )
{int p1,p2;
while((p1=fork( ))==-1); /*创建不成功就一直创建*/

if(p1==0)
putchar('b');
else
{while((p2=fork( ))==-1);
if(p2==0)
putchar('c');
else
putchar('a');
}
}

运行结果
abc
小弟真搞不懂,if…else…语句不是二者只执行其一吗,为什么它把所有的语句都执行完了。
 
本人到网上到处询问,终于得到完满解答:

方案一:(由一位网友提供 ,在此致谢)

#include <stdio.h>

main( )
{

int p1,p2;
while((p1=fork( ))==-1);

if(p1==0)
putchar('b');
else {
while((p2=fork( ))==-1);
if(p2==0) {
printf("The reture code is %d!\n",p2);
putchar('c');
}
else {
printf("The process ID %d!\n",p2);
putchar('a');
}
}
}

Results:
bThe reture code is 0!
cThe process ID 3856!
a
 

方案二:(由一位网友提供 ,在此致谢)
你肯定不知道fork做了什么,hehe
fork执行后,会自动复制当前的程序,并且从fork后的语句执行,如果是子进程fork返回0,父进程返回一个正数,
if(p1==0)
putchar('b');就是让第一次创建的子进程执行的
同理,当第二次fork后,if(p2==0) {
putchar('c');又第二个子进程执行
最后父进程执行 putchar('a');



方案三:(本人)

#include <stdio.h>

main( )
{int p1,p2;
while((p1=fork( ))==-1); /*(1)创建子进程p1,创建不成功就一直创建*/

if(p1==0) /*(2)p1创建成功 */
putchar('b');
else
{while((p2=fork( ))==-1);/*(3)创建子进程p2,创建不成功就一直创建*/
if(p2==0)
putchar('c'); /*(4)p2创建成功 */
else
putchar('a'); /*(5)父进程*/
}
}

这里只讨论 abc 一种情况标号看程序中的批注,

A: (1)很快创建成功,返回 PID>0 执行(5)输出 a (具体原因参考方案一,方案二)
B: p1负责执行一下两句:
if(p1==0)
putchar('b');
因为fork创建成功后返回两个值,有一个一定是0,所以输出 b

C: (3)成功 同理 输出 c
回复
相关推荐
发帖
Linux/Unix社区
创建于2007-08-27

2.0w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
帖子事件
创建了帖子
2002-12-19 10:31
社区公告
暂无公告