Linux学习记录(九)----进程(四)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 8.vfork创建进程
- 9.进程退出
- 1.正常退出
- 2.异常退出
上篇:进程(一)
中1:进程(二)
中2:进程(三)
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);