进程控制(三)
exit和_exit函数
作用:用来终止一个进程
函数原型:
exit函数原型:
#include <stdlib.h>
void exit(int status);
_exit函数原型:
#include <unistd.h>
void _exit(int status);
参数status:
-
作用:传递进程结束时的状态
-
0:正常结束
-
其他数值:非正常结束
_exit和exit的相似程度可以从linux源码中找到答案:
#define _ NR_ _exit _ NR _ exit
/*摘自文件include/asm-i386/unistd.h第334行*/
“_NR_”是在Linux的源码中为每个系统调用加上的前缀,注意第一个exit前有2条下划线,第二个exit前只有1条下划线。
exit函数使用例子exec_example.c:
#include <stdlib.h>
int main(void)
{
printf("this process will exit!\n");
exit(0);
printf("never be displayed!\n");
}
运行结果:
hyx@hyx-virtual-machine:~/test$ ./exit_example
this process will exit!
hyx@hyx-virtual-machine:~/test$
第二个printf执行前,exit(0)已经将进程终止,第二个字符串不会显示
注意:实际编程时,可以用wait系统调用接收子进程的返回值,从而针对不同情况进行不同处理。wait详细情况在下节介绍。
_exit和exit区别:
-
二者间的区别主要体现在他们在函数库中的定义
-
exit函数在被调用之前,先要检查文件的打开情况,把文件缓冲区的内容写回文件;_exit则直接使进程停止运行,清除其使用的内容空间,并消除其在内核中的各种数据结构(参考下面的例子来理解)
-
使用不同头文件:exit是由ANSI C说明的,而_exit则是由POSIX.1说明的
exit()与_exit()函数的区别:exit_differ.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
pid_t pid;
if((pid = fork()) == -1)
{
printf("failed to create a new process\n");
exit(0);
}
else if(pid==0)
{
printf("child process,output begin\n");
printf("child process,content in buffer");/*没有换行符'\n'*/
exit(0);
}
else
{
printf("\nparent process,output begin\n");
printf("parent process,content in buffer");/*没有换行符'\n'*/
_exit(0);
}
return 0;
}
运行结果:
hyx@hyx-virtual-machine:~/test$ ./exit_differ
parent process,output begin
child process,output begin
child process,content in buffer
没有换行符是说明目前printf的信息还在buffer(缓冲区)中,因为printf是将参数中的所有字符串先暂存在buffer中,只有当遇到换行符或制表符等才将buffer中的内容输出到标准输出中
从运行结果看出,子进程输出了两条,父进程只是输出了一条,因为在子进程退出之前,exit(0)先将缓冲区中的内容写到了标准输出;而在父进程中,我们使用的是_exit(0),直接进入了内核,并没有操作I/O流,也就是直接将缓冲区的内容清除掉了