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;
}
结果