进程控制(三)

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流,也就是直接将缓冲区的内容清除掉了

posted @ 2015-11-24 21:56  adacn  阅读(260)  评论(0编辑  收藏  举报