提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
8.vfork创建进程
vfork也可以创建进程,与fork有什么区别呢?
-
区别一:vfork可以直接使用父进程存储空间,不拷贝
-
区别二:vfork可以保证子进程先运行,当子进程调用exit退出后,父进程才执行
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int cnt = 0;
pid_t pid;
pid = vfork();
if(pid == -1)
{
printf("craete process failed\n");
return -1;
}
else if(pid > 0)
{
while(1)
{
printf("cnt = %d\n",cnt);
printf("parent process pid is %d\n",getpid());
sleep(1);
}
}
else if(pid == 0)
{
while(1)
{
cnt++;
printf("cnt = %d\n",cnt);
printf("child process pid is %d,ppid is %d\n",getpid(),getppid());
sleep(1);
if(cnt > 3)
{
exit(0);
}
}
}
return 0;
}
9.进程退出
1.正常退出
-
1.main函数调用return
-
2.进程调用exit(),标准C库
-
3.进程调用 _exit() 或者 _Exit(),属于系统调用
补充:
-
4.进程最后一个线程返回
-
5.最后一个线程调用pthread_exit
2.异常退出
-
1.调用abort函数
-
2.当进程收到某些信号时,比如ctrl +C
-
3.最后一个线程对取消(cancellation)请求做出相应
不管进程如何终止,最后都会执行内核中的同一段代码,这段代码和相应进程关闭所有打开描述符,释放它所使用 的存储器等。 对上述任一一种终止情形,我们都希望终止进程能够通知其父进程它是如何终止的。对于三个终止函数(exit, _exit 和 _ Exit),实现这一点的方法是,将其退出状态(exit status)作为参数传送给函数,在异常终止情况下,内核(不是 进程本身)产生一个指示其异常终止原因的终止状态(termination status)。在任意一种情况下,该终止进程的父进 程都能用wait或waitpid函数取得终止状态。
#include <stdlib.h>
void exit(int status);
#include <unistd.h>
void _exit(int status);
#include <stdlib.h>
void _Exit(int status);
标签:cnt,pid,----,终止,exit,Linux,进程,include
From: https://blog.csdn.net/qq_63556165/article/details/141088071