一、进程创建, 终止,等待(使用代码实现)
1、进程创建
(1)fork函数创建进程
fork调用格式如下:
#include <unistd.h>
pid_t pid = fork();
返回值:子进程返回0,父进程返回子进程的pid,创建失败返回-1
编写代码创建进程如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
printf("before: pid is %d\n",getpid());
if((pid = fork()) == -1)//fork()子进程返回0,父进程返回子进程pid
{
perror("fork");
exit(1);
}
printf("after:pid is %d,fork return is %d\n",getpid(),pid);
sleep(1);
return 0;
}
运行结果如下:
(2)vfork创建进程
fork与vfork使用区别:
1)vfork创建的子进程与父进程共享地址空间,fork的子进程具有独立的地址空间;
2)vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int flag = 100;
pid_t pid = vfork();
if(pid == -1)
{
perror("vfork()");
exit(1);
}
if(pid == 0)//child
{
flag = 200;
printf("child flag is %d\n",flag);
exit(0);
}
else//parent
{
printf("parent flag is %d\n",flag);
}
return 0;
}
可以看见:子进程改变了父进程的变量值,因为子进程在父进程的地址空间中运行。
我们用fork函数验证一下,看fork出来的子进程是否也可以修改父进程的变量值:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int flag = 100;
pid_t pid = fork();
if(pid == -1)
{
perror("fork()");
exit(1);
}
if(pid == 0)//child
{
flag = 200;
printf("child flag is %d\n",flag);
exit(0);
}
else//parent
{
sleep(1);
printf("parent flag is %d\n",flag);
}
return 0;
}
运行结果可见,并不可以噢。因为子进程有自己独立的地址空间。
2、进程终止
(1)进程退出的三种场景
代码运行完毕,正常正确;
代码运行完毕,结果不正确;
代码异常提出。
(2)进程常见的退出方法
- 1)正常终止(可以用echo $?查看进程退出码)
从main函数返回;
调用exit;
_exit;
- 2)异常退出
ctrl+c 信号终止
(3)终止进程场景演示如下
- 从main函数返回终止进程场景演示如下:
#include <stdio.h>
int main()
{