Linux 结束进程
一个进程由于以下5个原因中的一个终止
--main函数调用return;
--调用exit函数--C语言库函数;
--调用_exit函数--系统调用
--调用abort函数
--被一个信号终止。(kill函数)
前三个原因都是正常终止,后面两个是非正常终止。
无论进程为何终止,最后都执行相同的内核代码代码,关闭打开的文件,释放内存资源,和其他清理工作。
exit函数
int exit(int status);
exit导致程序正常终止,并且返回给父进程的状态(status)
exit的参数便是返回给父进程的状态码
在main函数中调用return和exit效果类似,但是在子函数中,return是退出当前函数,exit却是退出当前进程
exit()是C语言库函数,_exit()是系统调用,
exit在退出程序时,先调用终止处理程序,然后清除I/O缓冲,然后再调用系统调用_exit(),所以exit()可以打印出printf()函数中的字符串;
_exit()会直接进入到Linux内核操作,不会清除I/O缓冲
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> int main(int arg,char *args[])
{
/*Linux下,printf函数必须以'\n'结尾才会立刻输出到屏幕,
* 如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算)*/
printf("hello world!");
//exit(0); 打印 "hello world!"
_exit(); //不打印 "hello world!"
}
exit()会调用终止处理程序
atexit()可以注册终止处理程序,ANSIC规定最多可以注册32个终止处理程序
终止处理程序的调用与注册次序相反
int atexit(void (*function)(void));
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> void by1(void)
{
printf("by1 执行了!\n");
} void by2(void)
{
printf("by2 执行了!\n");
} int main(int arg,char *args[])
{
//注册终止处理程序
atexit(by1); atexit(by2);
printf("hello world!\n");
exit();
//_exit(0); _exit()不执行终止处理程序
/*
* 打印:
* hello world!
* by2 执行了!
* by1 执行了!
* 证明了先注册后执行
* */
}
abort函数
void abort(void);
abort导致程序异常终止
abort还可以让程序产生core,这是大多数调试器用户分析程序崩溃时的文件。
虽然任何打开的文件都被关闭了,但是abort仍然是个粗暴的调用,应该作为最后的手段来使用。
比如当你遇到一个很严重内存不足这样的错误,无法用程序的方式处理时再使用。
kill函数
int kill(pid_t pid,int sig);
exit,abort用来杀死进程自己。
kill函数用来杀死另一个进程。
参数pid指定一个要杀死的进程,而sig是要发送的新号,本章内容是杀死一个进程,所以只需要关注SIGKILL一个信号。
例如:kill(,SIGKILL);
Linux 结束进程的更多相关文章
- Linux结束进程到底有多少种方法?
我们经常在Linux里使用kill命令来结束某后台进程.但kill命令实际上是向进程发送信号,并且有多种信号.终止运行一个程序只是其中一个信号而已.kill是根据进程号发送信号的,而另一个工具kill ...
- linux结束进程命令
在linux中,进程之间通过信号来通信.进程的信号就是预定义好一个消息,进程能识别它并决定忽略还是做出反应. 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL ...
- Linux 将进程放入后台执行,解决网络,ssh断开导致进程结束(nohup, setsid, &, disown)
Linux 将进程放入后台执行,解决网络,ssh断开导致进程结束(nohup, setsid, &, disown) 1.nohup 命令 我们知道,当用户注销(logout)或者网络断开 ...
- 【Linux】进程的结构,创建,结束,以及程序转化为的进程的过程
本文内容: 1.进程的结构 2.程序转化为进程的过程 3.进程的创建 4.进程的结束 背景知识: 1.进程是计算机中处于运行的程序的实体 2.进程是线程的容器 3.程序本身只是指令,数据以及组织形式的 ...
- Linux查看和结束进程命令详解
在ubuntu中,终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ----------------------------------- ...
- Linux编程 7 (实时监测进程 top, 结束进程kill,killall)
一. 实时监测进程 top 在一篇里讲到ps命令在收集进程信息时非常有用,但它只能显示某个特定时间点的信息.想要观察那些频繁换进换出的内存进程趋势,用top命令是合适的.使用top命令如下图所示: 在 ...
- linux查看进程与结束进程
查看所有进程 ps -ef ps -ef | grep 查找的进程名 结束进程 ps -ef | grep 查找的进程名 | grep -v grep | awk '{print $2}' | xar ...
- [转]❲阮一峰❳Linux 守护进程的启动方法
❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...
- Server Develop (七) Linux 守护进程
守护进程 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装 ...
随机推荐
- 【读书笔记】iOS-写代码注意事项
一,我是尽早和经常编译的强烈支持者.通常,在写完每个方法或有点难度的代码后,都要尝试进行构建.这是一个好习惯,因为如果在上次成功编译以来添加的代码量很小,那么可以非常容易地缩小编译错误范围.这个方法还 ...
- iOS应用程序开发之应用间的跳转(用着微信等第三方分享登陆)
简介 配置和实现 判断应用启动方式 一.简介 最实际项目开发中,我们难免会遇到需要从一个应用跳转到另一个应用的情况.比如微信分享,实际就是一种应用间的跳转.但是有时候我们需要实现自己的两个应用间的跳转 ...
- 彻底退出所有的Acticity
有时候点击回退键退出应用,会出现有些Activity不能完全退出的情况,那么可以使用前面这个方法: 在需要退出的Activity的onCreate()方法中加入 ExitApplication.get ...
- android学习笔记 Service
Service(服务): 长期后台运行的没有界面的组件 android应用什么地方需要用到服务? 天气预报:后台的连接服务器的逻辑,每隔一段时间获取最新的天气信息.股票显示:后台的连接服务器的逻辑,每 ...
- android5.x新特性之Tinting
Android5.X对图形操作上有更多的功能.下面来看看Tinting(着色) Tinting的使用非常简单,几乎 没什么好说的,只要在xml中配置好tint和tintMode即可.直接看实际例子吧. ...
- LevelDB源码分析--使用Iterator简化代码设计
我们先来参考来至使用Iterator简化代码2-TwoLevelIterator的例子,略微修改希望能帮助更加容易立即,如果有不理解请各位看客阅读原文. 下面我们再来看一个例子,我们为一个书店写程序, ...
- 如何成功发布一个MSMQ的Windows服务
因为MSMQ的使用需要不断的查看队列是否有新消息,所以一般是结合Windows的服务,当然也可以用一个不关闭的Winform程序,不过前者更好一些,不怕被人误关. 完成MSMQ的WindowsServ ...
- cordova 环境搭建
安装环境前题是nodejs已安装,android环境搭建完成,android环境没有通过http://www.androiddevtools.cn/安装,安装使用 淘宝 NPM 镜像 方式 1.运行c ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- history介绍及bash命令快速调用
在日常工作中,能够快速并准确的使用命令是必不可少的,下面为大家介绍一下其中的小技巧. 一.查找命令历史——history 使用history能够快速的找到之前输入过的命令. # history 大家可 ...