多进程之进程退出函数:exit,_exit,atexit详解
关于进程推出的三个函数:exit,_exit,atexit,下面是关于这三个函数的作用与详解
1. exit函数:
函数原型:
#include <stdlib.h>
void exit(int status);
1.函数作用:在调用后会让进程正常退出;并且在进程退出时会刷新缓冲区数据
2.函数形参:
status:进程退出时的状态值,即在使用时给它一个无符号的整型数,该数将会作为进程的退出状态;并且要在0-255范围内,否则将自动默认为未定义退出状态值
3.函数返回值:无
2. _exit函数:
函数原型:
//两个函数是一个的,不过不在头一个头文件
#include <unistd.h>
void _exit(int status);
#include <stdlib.h>
void _Exit(int status);
1.函数作用:使用此函数将立即终止一个进程,并把它的状态值返回,注意:由于进程是非正常结束;所有当进程死亡时会通知父进程发出一个信号;这个SIGCHLD信号将告知系统回收该进程的资源;并且退出时不刷新缓冲区,若有打开的文件也不会进行关闭操作;所以可能会造成数据丢失,尽量少用吧
2.函数形参:
status:进程退出时的状态值,即在使用时给它一个无符号的整型数,并且要在0-255范围内,否则将自动默认为未定义退出状态值(与exit函数参数一致)
3.函数返回值:无
验证代码:
/*
*关于exit()与_exit()两个函数测试
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
//创建一个子进程
pid_t id = fork();
//创建失败,直接退出整个进程
if(id<0)
{
perror("fork failed");
return -1;
}
//如果是子进程,打印26字母
else if(id==0)
{
printf("good good study");
//退出子进程并且刷新缓冲区的数据
_exit(0);
}
//不加换行符,一般需要进程运行结束才会刷新缓冲区
printf("hello world");
//退出程序并且刷新缓冲区
exit(0);
}

运行结果:
(1)子进程的因为是立即终止进程非正常退出,因此没有刷新缓冲区的数据,所以没有往屏幕打印“good good study”,
(2)父进程使用的是exit是正常退出该进程,所以可以在进程被exit结束进程后打印“hello world”
3. atexit函数:
函数原型:
#include <stdlib.h>
int atexit(void (*function)(void));
1.函数作用:注册一个进程退出处理函数,在进程正常退出(at normal exit)后再执行一个自己写的程序(与_exit一起使用无效),并且子进程会继承父进程注册的进程退出处理函数
2.函数形参:
(1)void (*function)(void):本质是一个函数指针,用于接受一个函数名,在执行结束后执行该函数的代码
3.函数返回值:成功返回0,否则返回得0值
验证代码:
/*
*关于atexit函数测试
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
void func(void)
{
printf("i am a function\n");
}
int main()
{
int ret = atexit(func);
//创建一个子进程
pid_t id = fork();
if(id<0)
{
perror("fork failed");
return -1;
}
//如果是子进程
else if(id==0)
{
printf("hello world");
//退出子程序,但是不刷新缓冲区
_Exit(0);
}
printf("hello world");
//退出程序并且刷新缓冲区
exit(0);
}

运行结果:
(1):子进程因为使用了_exit函数,该函数是立即终止进程,并且不刷新缓冲区,因此子进程中没有任何输出
(2):父进程使用了exit函数,是正常退出,因此输出了图中的结果
总结:
1.使用exit函数是会结束进程后自动刷新缓冲区,且是正常退出
2.使用_exit函数是不会在进程结束后刷新缓冲区,且是立即终止进程(非正常退出)
3.atexit函数只由进程在正常退出情况下才能使用,因此atexit能与exit一起使用,但不能与_exit一起使用
================================================
这些都是关于我个人的一些理解如果有什么地方写错或者画错了麻烦告知一下,真的非常感谢
更多推荐



所有评论(0)