<!--[if !supportLists]-->Ÿ <!--[endif]-->退出/终止进程 

void _exit(int status) 与 void exit(int status) 

这两个函数都是让进程退出, 参数status表示进程将以何种状态退出,在<stdlib.h>中预定义了一些状态,比如EXIT_SUCCESS(值为0)表示以成功状态退出,EXIT_FAILURE(值为1)表示以失败状态退出。 

调用_exit函数时,其会关闭进程所有的文件描述符,清理内存以及其他一些内核清理函数,但不会刷新流(stdin, stdout, stderr  ...).   exit函数时在_exit函数之上的一个封装,其会调用_exit,并在调用之前先刷新流。 

参考下面这段代码: 

#include <stdio.h>    //for printf(const char *)
#include <unistd.h> //for fork()
#include <sys/wait.h> //for wait(int *)
#include <stdlib.h> //for EXIT_SUCCESS int main ()
{
printf("app start...\n"); if(fork() == )
{
printf("do something in child process ...\n"); exit(EXIT_SUCCESS); printf("this will not been executed\n");
} int status;
wait(&status); printf("app end\n"); return ;
}
上面的代码无论时用exit还是_exit输出结果都如下:
app start...
do something in child process ...
app end
这是因为stdout缓冲区是按行缓冲的,当遇到换行符时会刷新当前缓冲区,所以当进程退出前即便_exit不刷新,"do somethign in child process "这句话仍然被输出到了屏幕上。
现在我们将使用不带换行符的printf, 并且也不调用fflush之类的函数,在使用_exit试试:
#include <stdio.h> //for printf(const char *)
#include <unistd.h> //for fork()
#include <sys/wait.h> //for wait(int *)
#include <stdlib.h> //for EXIT_SUCCESS int main ()
{
printf("app start...\n"); if(fork() == )
{
printf("do something in child process ..."); _exit(EXIT_SUCCESS); printf("this will not been executed\n");
} int status;
wait(&status); printf("app end\n"); return ;
}
输出结果为:
app start...
app end
如果换成exit则输出结果为:
app start...
do something in child process ...app end void abort ()
非正常地退出进程。其会产生一个SIGABORT信号,然后使进程戛然而止,也就意味着其不会进行清理工作, 但它会刷新缓冲区。
#include <stdio.h> //for printf()
#include <unistd.h> //for fork()
#include <sys/wait.h> //for wait()
#include <stdlib.h> //for EXIT_SUCCESS int main ()
{
printf("app start...\n"); if(fork() == )
{
printf("do something in child process ..."); abort(); printf("this will not been executed\n");
} int status;
wait(&status); printf("app end\n"); return ;
}
输出为:
app start...
do something in child process ...app end void atexit( void (*f) () )
at the exiting moment.如果想在进程正常结束之前干一点自定义的事情,就可以调用这个函数. 其简单地利用你传入的函数指针执行一个函数回调。
值得注意的是:其仅仅在调用exit函数结束进程或进程执行完所有代码后自然结束这两种状态下,回调函数才会被执行,也就是说如果进程是被_exit或abort结束的,则atexit函数无效
#include <stdio.h> //for printf()
#include <unistd.h> //for fork()
#include <sys/wait.h> //for wait()
#include <stdlib.h> //for EXIT_SUCCESS void before_exit()
{
printf("1,2,3 exit!\n");
} int main ()
{
printf("app start...\n"); if(fork() == )
{
printf("do something in child process ...\n"); void (*f)() = before_exit;
atexit(f); exit(EXIT_SUCCESS); printf("this will not been executed\n");
} int status;
wait(&status); printf("app end\n"); return ;
} 输出为:
app start...
do something in child process ...
,, exit!
app end

linux 进程学习笔记-进程退出/终止进程的更多相关文章

  1. Linux内核学习笔记(3)-- 进程的创建和终结

    一. 进程创建: Unix 下的进程创建很特别,与许多其他操作系统不同,它分两步操作来创建和执行进程: fork() 和 exec() .首先,fork() 通过拷贝当前进程创建一个子进程:然后,ex ...

  2. LINUX编程学习笔记(十四) 创建进程与 父子进程内存空间

    1什么是进程:进程是一个执行中的程序 执行的程序: 代码->资源->CPU 进程有很多数据维护:进程状态/进程属性 所有进程属性采用的一个树形结构体维护 ps  -a//所有进程 ps - ...

  3. Linux内核学习笔记(1)-- 进程管理概述

    一.进程与线程 进程是处于执行期的程序,但是并不仅仅局限于一段可执行程序代码.通常,进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个 ...

  4. linux进程学习笔记

    学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...

  5. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  6. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  7. Linux学习笔记(5)-进程管理

    进程简介 进程是正在执行的一个程序或命令,每一个进程都有自己的地址空间,并占有一定的系统资源.感性的认识,进程就是一个正在运行的程序 进程管理的作用 判断服务器的运行状态 查看系统中有哪些进程 杀死进 ...

  8. 尚硅谷韩顺平Linux教程学习笔记

    目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...

  9. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

随机推荐

  1. 导出txt格式的说明书

    /// <summary> /// 说明书 /// </summary> /// <returns></returns> public FileResu ...

  2. java移位运算符详解

    http://soft.chinabyte.com/database/195/11553695.shtml java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和 ...

  3. USB协议[转]__总结得很好

    一 枚举过程:◆ 用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态.◆主机检测设备.◆集线器使用中断通道将事件报告给主机.◆主机发送Get_Port_Status(读端口状态) ...

  4. 30:根据排序标识flag给数组排序

    题目描述:输入整型数组和排序标识,对其元素按照升序或降序进行排序 接口说明 原型: void sortIntegerArray(Integer[] pIntegerArray, int iSortFl ...

  5. Centos6.0使用第三方YUM源(EPEL,RPMForge,RPMFusion)

    yum是centos下很方便的rpm包管理工具,配置第三方软件库使你的软件库更加丰富.以下简单的讲下配置的步骤. 首先,需要安装yum-priorities插件: yum install yum-pr ...

  6. Urho3D 在Win10下编辑器崩溃的解决方案

    本解决方案来自于 https://github.com/urho3d/Urho3D/issues/2417 描述 在Win10中通过CMake启用URHO_ANGELSCRIPT选项的前提下生成Urh ...

  7. 【selenium+Python unittest】之使用smtplib发送邮件错误:smtplib.SMTPDataError:(554)、smtplib.SMTPAuthenticationError(例:126邮箱)

    原代码如下: import smtplib from email.mime.text import MIMEText from email.header import Header #要发送的服务器 ...

  8. 【BZOJ4281】[ONTAK2015]Związek Harcerstwa Bajtockiego LCA

    [BZOJ4281][ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点.之后 ...

  9. 【分享】自己写的一个可空的DateTimePicker控件-附源码

    最近这段时间在重构以前的一个项目,其中有一项就是要把DateTimePicker控件值可空.大家都知道的DateTimePicker值为DateTime类型,DateTime类型值不能等于Null.但 ...

  10. React-Native开源项目学习

    https://github.com/liuhongjun719/react-native-DaidaiHelperNew 借贷助手https://github.com/liuhongjun719/r ...