zoukankan      html  css  js  c++  java
  • 进程控制(三)

    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!
    ");
    	exit(0);
    	printf("never be displayed!
    ");
    }
    
    运行结果:
    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
    ");
    		exit(0);
    	}
    	else if(pid==0)
    	{
    		printf("child process,output begin
    ");
    		printf("child process,content in buffer");/*没有换行符'
    '*/
    		exit(0);
    	}
    	else
    	{
    		printf("
    parent process,output begin
    ");
    		printf("parent process,content in buffer");/*没有换行符'
    '*/
    		_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流,也就是直接将缓冲区的内容清除掉了

  • 相关阅读:
    回溯算法(DFS:深度优先)
    KNN原理和实现
    Anaconda虚拟环境控制
    c++容器
    最坏情况为线性时间的选择算法
    JVM原理解析
    substr、substring和slice的区别
    word-wrap与break-word属性的区别
    js修改伪类的值
    快速批量删除文件名中相同的文字
  • 原文地址:https://www.cnblogs.com/myidea/p/4993048.html
Copyright © 2011-2022 走看看