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并 ...
随机推荐
- Java 使用StringBuffer注意
Stringbuffer使用注意 问题背景: 模拟客户端使用Socket请求服务器核心系统,核心系统正常响应,内容较大,近2715KB,大于2.6M多. 使用指定编码GBK来接收响应内容到过程中没 ...
- ios控件自定义指引
转载自:http://bbs.9ria.com/thread-256747-1-1.html 一直以来都想写点什么,做点有意义的事,从今天开始我将会把自己在这一年的学习和应用IOS开发中的学习心得和体 ...
- CocoaAsyncSocket 文档1:Socket简单介绍
前言 CocoaAsyncSocket是 IOS下广泛应用的Socket三方库,网上相关样例数不胜数.这里我就不直接上代码,本文由B9班的真高兴发表于CSDN博客.另辟一条思路:翻译SocketAsy ...
- Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
posix消息队列与system v消息队列的区别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则能够返回随意指定优先级的消息. (2)当往一个空队列放 ...
- snmp默认团体名/弱口令漏洞及安全加固
0x00基础知识 简单网络管理协议(SNMP)被广泛用于计算机操作系统设备.网络设备等领域监测连接到网络上的设备是否有任何引起管理上关注的情况.在运行SNMP服务的设备上,若管理员配置不当运行默认团体 ...
- 10个经典Java面试题
1.Java的HashMap是怎样工作的? HashMap是一个针对数据结构的键值.每一个键都会有对应的值.关键是识别这种值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...
- Linux进入单用户模式
有时候配置linux的过程中,因为一些误操作导致系统初始化时堵塞或挂起而无法进入系统,原因往往是因为配置文件设置错误,部分文件被误删之类.遇到这种情况一般新手的做法就是重装(虚拟机不装白不装),但在实 ...
- 深入Asyncio(五)Event Loop
Event Loop loop除了处理协程间的切换与结束时的异常捕捉,还要监听socket和文件描述符.先做个小测试: >>> import asyncio >>> ...
- MySQL -- Ubuntu下的操作命令
=======================安装======================参照MySQL官网的步骤:https://dev.mysql.com/doc/mysql-apt-repo ...
- JavaMelody tomcat应用监控
1 下载相关jar包,maven地址 测试发现 1.57.0版本tomcat6工程登陆报错,改用版本 1.50.0是正常的 <dependency> <groupId>net. ...