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中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装 ...
随机推荐
- Android项目实战(九):CustomShapeImageView 自定义形状的ImageView
一个两年前出来的第三方类库,具有不限于圆形ImageView的多种形状ImageView,项目开发必备 github下载地址:https://github.com/MostafaGazar/Custo ...
- 安卓开发_浅谈Service
一.Service(服务) Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,区别在于它没有UI界面,是在后台运行的组件. public abst ...
- 【读书笔记】iOS-复制的种类
一,你可以使用不同的方法复制对象.大多数对象都引用(即指向)其它对象. 二,浅层复制,不复制引用对象,新复制的对象只指向现有的引用对象.NSArray类的copy方法是浅层复制.当复制一个NSArra ...
- 简单认识UISwitch
以下是常用属性: self.mySwitch.layer.cornerRadius = 15; // 边框圆角角度 self.mySwitch.layer.borderWidth = 2; // ...
- Spring(八)SSH整合简述
一.Spring与Struts2的整合 1.1.整合步骤 1.2.配置web.xml 1.3.配置spring配置文件applicationContext.xml 1.4.配置struts配置文件 1 ...
- PAT 01-2
#include<stdio.h> #include<stdlib.h> int main() { int k; int *data; int i; int ThisSum, ...
- Android中有时候运行程序的时候会报错:An internal error occurred during:。。。。
解决办法: Project -> Properties -> Run/Debug Settings: 1. select "Launching New_configuration ...
- Linux之格式化与挂载
格式化与挂载 一块硬盘要想被使用,要经过分区,格式化,挂载这三个步骤.前面我们讲过MBR分区和GPT分区. 下面我们就来讲一下如果格式化一个分区.其实很简单,一句话就能搞定了. 首先来查看一下sdb盘 ...
- c# 进程间通信 IPC
最近在调试一个算法,想通过改变算法的参数看看结果有什么变化. 碰到一个麻烦的事情是,从磁盘加载.构建数据需要15分钟.这就比较讨厌了,也就是说我每次调一个参数前都要等15分钟启动时间? 于是我就想,能 ...
- PHP递归创建多级目录(一道面试题的解题过程)
今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @mkd ...