社区
Linux/Unix社区
帖子详情
关于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! ?
到底何为一个进程?是上面的一整个程序,还是一个库函数就算?
多谢指教!
...全文
122
7
打赏
收藏
关于fork()函数的一点疑惑!
我在阅读《进程间通信》。文中有这样一个例程。 #include #include #include void main(void) { printf("Hello!"); fork(); printf("Bye!"); } 为何结果会打出两遍Bye! ? 到底何为一个进程?是上面的一整个程序,还是一个库函数就算? 多谢指教!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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
关于多进程编程中
fork
()
函数
返回两次的探究
首先要明白的是
fork
函数
的作用,它是用来创建一个子进程,和父进程一样的子进程,是父进程的一个副本。 子进程将会有自己的地址空间,并且会获得父进程的数据段的副本以及堆栈的副本,所获得的副本都是精确...
关于
fork
()
函数
的
一点
思考
关于
fork
()
函数
的
一点
思考 最近看操作系统的进程部分,对
fork
()
函数
的有些
疑惑
,于是查书本,看博客,花了一晚上时间研究了一下
fork
()的执行过程,终于有了一些收获。
fork
()对初学者来说还是比较容易混淆的,特别...
20170907_关于
fork
函数
和父子进程的理解
20170907_关于
fork
函数
和父子进程的理解
Linux 关于
fork
函数
和sleep
函数
以及通信管道的一些思考
意识到以前一直忽略了一个问题,就是
fork
函数
创建的子进程与父进程执行的顺序究竟是怎样的.在网上寻找了一下,没有找到答案。于是写了以下的程序进行测试: #include #include int main(){ pid_t t =
fork
(),count=...
fork
函数
简介
包括:
fork
函数
简介
fork
函数
的两次返回和父子进程的执行顺序简介
fork
()子进程与父进程之间的文件描述符问题 [cpp]view plaincopyprint? 1 1 #include
Linux/Unix社区
23,217
社区成员
74,540
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章