linux 进程学习笔记-进程退出/终止进程
<!--[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 进程学习笔记-进程退出/终止进程的更多相关文章
- Linux内核学习笔记(3)-- 进程的创建和终结
一. 进程创建: Unix 下的进程创建很特别,与许多其他操作系统不同,它分两步操作来创建和执行进程: fork() 和 exec() .首先,fork() 通过拷贝当前进程创建一个子进程:然后,ex ...
- LINUX编程学习笔记(十四) 创建进程与 父子进程内存空间
1什么是进程:进程是一个执行中的程序 执行的程序: 代码->资源->CPU 进程有很多数据维护:进程状态/进程属性 所有进程属性采用的一个树形结构体维护 ps -a//所有进程 ps - ...
- Linux内核学习笔记(1)-- 进程管理概述
一.进程与线程 进程是处于执行期的程序,但是并不仅仅局限于一段可执行程序代码.通常,进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个 ...
- linux进程学习笔记
学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- Linux学习笔记(5)-进程管理
进程简介 进程是正在执行的一个程序或命令,每一个进程都有自己的地址空间,并占有一定的系统资源.感性的认识,进程就是一个正在运行的程序 进程管理的作用 判断服务器的运行状态 查看系统中有哪些进程 杀死进 ...
- 尚硅谷韩顺平Linux教程学习笔记
目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...
- Linux系统学习笔记:文件I/O
Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...
随机推荐
- bottle的几个小坑
距离我在<web.py应用工具库:webpyext>里说要换用bottle,已经过去快两个月了--事实上在那之前我已经開始着手在换了.眼下那个用于 Backbone.js 介绍的样例程序已 ...
- React学习之redux
在阅读本文之前,希望大家对以下知识点能提前有所了解并且上好厕所(文章有点长): 状态提升的概念 react高阶组件(函数) es6基础 pure 组件(纯函数) Dumb 组件 React.js的co ...
- 1.1 合用weightSum属性和layout_weight属性
<打造高质量Android应用:Android开发必知的50个诀窍>第1章活用布局,本章将介绍Android布局相关的一些窍门和建议.通过本章,读者不仅可以学习如何从零开始创建特定类型的布 ...
- CSS解决无空格太长的字母,数字不会自己主动换行的问题
事实上非常easy,代码例如以下所看到的,注意 Style: <div class="detail_title" style="word-break: break- ...
- 扒一扒P2P风控的底牌(转)
互联网金融,这里面水就太深了,能当理财买的一般有两类,一个是货币基金,比如余额宝,这个大家已经十分清楚了,没什么风险, 但问题就是收益越来越低.实在是不过瘾了.而另外一种就是P2P理财了,收益很高,也 ...
- 给定一颗完全二叉树,给每一层添加上next的指针,从左边指向右边
给你机会发出声音,但是不给你机会证明高层的决定是错的 RT: 时间复杂度O(n) 空间复杂度O(1) 原理就是有指针指向父节点和当前的节点,左孩子必指向右孩子,右孩子必指向父节点的下一个节点的左孩子 ...
- Unity编辑器扩展之RequireComponent等详解
RequireComponent的使用: 当你添加的一个用了RequireComponent组件的脚本,需要的组件将会自动被添加到game object(游戏物体).这个可以有效的避免组装错误.举个例 ...
- 转载 ----Android学习笔记 - 蓝牙篇 (Bluetooth)
1.什么是蓝牙 Bluetooth是目前使用的最广泛的无线通讯协议之一 主要针对短距离设备通讯(10米) 常用于连接耳机.鼠标和移动通讯设备等 2.发现周围蓝牙设备 BluetoothAd ...
- Mac 下 Git 的基础命令行操作
Mac 下 Git 的基础命令行操作 sudo apt-get install git-core //安装Git 用户配置 git config --global user.name "Yo ...
- cocos2d-js添加百度MSSP插屏(通过jsb反射机制)
1.导入jar包.... 2.修改AndroidManifest.xml文件 添加: <meta-data android:name="BaiduMobAd_APP_ID" ...