exit和_exit函数和atexit函数
相对于return函数,exit和_exit是用于专门退出进程的函数,而return不是用于专门退出进程的,只是执行mian函数时,return可以退出进程。(return退出当前函数执行的栈空间,并返回当前函数执行的结果)
void _exit(int status);
功能:退出当前进程(系统调用不会刷新缓冲区)
参数:
@status:进程退出状态(status & 0377)[0-255]
#define EXIT_FAILURE 1 /* Failing exit status. */
#define EXIT_SUCCESS 0 /* Successful exit status. */
返回值:无
void exit(int status);
功能:退出当前进程(库函数会刷新缓冲区)
参数:
@status:进程退出状态(status & 0377)
#define EXIT_FAILURE 1 /* Failing exit status. */
#define EXIT_SUCCESS 0 /* Successful exit status. */
返回值:无
exit实例 刷新缓冲区 输出1 2
#include
void func()
{
printf("1
");
printf("2");
exit(20); //退出进程,刷新缓冲区,子进程退出,父进程没有回收资源,子进程是僵尸态
printf("3
");//进程退出了,这句话不会执行
}
int main(int argc, const char *argv[])
{
pid_t pid;
pid = fork();
if (pid == -1)
{
perror("fork error");
exit(-1);
}
else if (pid == 0)
{
// 子进程
func();
}
else
{
// 父进程
while (1)
{
}
}
return 0;
}
_exit实例 输出 1
#include
void func()
{
printf("1
");
printf("2");
_exit(20); //退出进程,刷新缓冲区,子进程退出,父进程没有回收资源,子进程是僵尸态
printf("3
");//进程退出了,这句话不会执行
}
int main(int argc, const char *argv[])
{
pid_t pid;
pid = fork();
if (pid == -1)
{
perror("fork error");
exit(-1);
}
else if (pid == 0)
{
// 子进程
func();
}
else
{
// 父进程
while (1)
{
}
}
return 0;
}
在main函数中遇到return后还能够调用其他函数?
可以,通过atexit函数完成回调函数的注册
#include
void func(void)
{
printf("11111111111111111
");
}
int main(int argc,const char * argv[])
{
// 注册进程退出后被回调的函数
atexit(func);//注册 还没调用
printf("%s:%s:%d
",__FILE__,__func__,__LINE__);
return 0;
}