1.进程的属性保存在一个被称为___的结构体中,这个结构体中包括__、进程组、进程环境、进程的运行状态等
1、进程控制块/PCB 进程控制符/PID
2.进程在内存中可能会出现不同的状态,通常进程的状态被划分为5种:
初始态,就绪态,运行态,睡眠态,终止态
它们的关系为:
、
、
在每次调用fork()函数创建子进程后,子进程和父进程都会继续执行for循环,如当前i=1,则在i=0时父进程创建出的子进程与父进程本身都会创建一个子进程,如下图所示:
因此i=1时fork()函数调用后进程的数量为4,在下一轮循环中,这4个进程又都会创建一个新进程,进程的数量变为8,由此可得,在第5次循环结束后,进程的数量变为32,则子进程的数量为32-1=31。
总结:不跳出子进程,总的进程数量为2^i 即这里是2^5=32个进程
所以子进程为2^i-1
这里是2^5-1=31;
**简答:**见课本p151
看下面wait(NULL)
wait(NULL)
捕获二次子进程
所以先看子进程
pid1子进程睡眠3
pid2睡眠1
先执行pid2,再pid1
所以结果为
child process_2
child process_1
info1 from parent process
info2 from parent process
编程:
编写程序,父子进程打印不同东西
#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("This is parent process.\n");
}
else if (pid == 0)
{
printf("This is child process.\n");
}
return 0;
}
、、
、、
编写程序,创建子进程,使子进程通过exec更改代码段,执行cat命令
#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\n",getpid());
}
else if(pid==0)
{
printf("child process pid:%d\n",getpid());
//execlp可以使用相对路径
execlp("cat","-b","exec.c",NULL);//NULL结尾 exec.c是文件名
}
return 0;
}
显示出文件内容 cat命令
相当于
cat -b exec.c
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_35629971/article/details/122139070
内容来源于网络,如有侵权,请联系作者删除!