操作系统子父进程的关系

操作系统子进程和父进程的关系(fork()函数)

用linux中的unistd.h头文件实现讨论子、父进程:

unistd.h是C++ 中提供对 POSIX 操作系统 API 的访问功能的头文件.
其中的fork()函数可以创建一个当前进程的子进程,可以复制父进程的数据和堆栈空间,继承父进程的代码、资源等.
fork只执行返回值之后的代码,并返回两次值,一次返回给父进程,值为子进程的标识值pid,另一次返回给当前进程,值为0.

以下述代码为例(编译工具:http://www.dooccn.com/c/):

1.输出几个HELLO?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main () {
    
    
fork();
fork();
printf("HELLO\n");
}

运行结果
为什么不会死循环?如上文,fork只执行返回值之后的代码,故子进程不会再调用fork函数,但是返回两次值,所以会输出4次HELLO
先分析第二个fork,创建子进程之后,返回pid给父进程,也返回了0给子进程,因此printf(“HELLO\n”)会执行两次;同理,第一个fork执行之后,后两行代码也会执行两次,而后两行代码又会执行两次printf(“HELLO\n”),故共执行四次printf(“HELLO\n”);

2.返回何值?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main () {
    
    
int pid;
pid=fork();
if(pid==0)
printf("子进程:pid=%d\n",pid);
else
printf("父进程:pid=%d\n",pid);
}

运行结果
在这里插入图片描述
经测试,pid起始值为12,若继续调用fork,pid将递增

3.子进程和父进程谁先谁后?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main () {
    
    
int pid;
pid=fork();
for(int i=0;i<20;++i)
{
    
    
if(pid==0)
printf("子进程,i=%d\n",i);
else
printf("父进程,i=%d\n",i);
}
}

运行结果(去掉了换行符)

为了便于展示,没有换行。由结果可见,父进程先,子进程后,若父、子进程同步,那么父、子进程应该交错输出,而实际上父进程输出完了子进程才输出,因此并非同步。可增加循环次数验证。

猜你喜欢

转载自blog.csdn.net/weixin_42419611/article/details/104648572