Linux系统级程序设计第二课

本文探讨了Linux系统中的进程创建方法,重点讲解了fork()函数的工作原理和返回值解析。通过实例演示了如何使用fork创建子进程,并解释了子进程ppid不等于父进程pid的原因。此外,还介绍了如何利用sleep控制进程执行顺序和子进程编号的非递增现象。
摘要由CSDN通过智能技术生成

Linux系统级程序设计第二课

学习内容:

创建进程
fork()函数
#include <unistd.h>
pid_t fork(void);

fork()函数创建的进程为子进程。
调用fork()函数的进程称父进程。

功能:创建进程;函数执行后,系统会创建一个与原进程几乎相同的进程,之后父子进程都继续执行,

参数说明:无

返回值说明:
成功:返回两个值,子进程创建成功后,原程序会被复制,就有了两个fork函数。父进程的fork函数会返回子进程的pid,子进程的fork函数会返回0.
不成功:若子进程创建失败,原程序不会复制,父进程的fork函数返回-1。

实例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid=fork();
if(pid==-1)
{
perror(“fork error”);
exit(-1);
}
else if(pid>0)
{
printf(“parent process,pid=%d,ppid=%d\n”,getpid(),getppid());
}
else if(pid==0)
{
printf(“child process,pid=%d,ppid=%d\n”,getpid(),getppid());
}
return 0;
printf(“…finish…\n”);
printf(“202031061370 PURUI”);
}

结果
在这里插入图片描述
思考:
当我们多次执行上述代码后会发现这样一个问题:child process输出的ppid不等于父进程的pid, 这是什么原因?

出现这种情况,是因为父进程先于子进程终止,子进程变成“孤儿进程”,后面由init进程来接收。

创建多个进程:进程的执行顺序:利用sleep函数,暂缓进程执行

(1)子进程的编号不是递增的;
(2)终端提示符后面仍然有子进程信息打印,而命令提示符在最后一行的开头闪烁。
这是为什么?

提示:
在Linux系统中,子进程应由父进程回收,但是当子进程被创建后,它与它的父进程及其它进程共同竞争系统资源,所以父子进程执行的顺序是不确定的,终止的先后顺序也是不确定的。
Shell命令提示符也是1个进程,它需要和新建进程一起竞争CPU。

代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid;
int i;
for(i=0;i<5;i++){
if((pid=fork())0)
break;
}
if(pid
-1)
{
perror(“fork error”);
exit(1);
}
else if(pid>0)
{
sleep(5);
printf(“parent pid=%d\n”,getpid());

}
else if(pid==0)
{
    sleep(i);
    printf("I am child%d pid=%d\n",i+1,getpid());
}
return 0;

}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值