提示:以下案例仅供参考

文章目录

  • 进程退出的形式
  • 进程退出的几种方法

进程退出的形式

进程退出的几种情况

  • 正常退出(自愿,代码运行完其结果正确)
  • 错误退出(自愿,代码运行完其结果不正确)
  • 异常退出(非自愿,代码异常直接终止)
  • 被其他进程终止(非自愿)

自愿退出会返回一个退出码,由父进程接收。

在Linux上可以使用命令echo $?显示最近一次退出的进程返回的退出码

  //现有如下代码,源文件名为mycode.c1 # include <stdio.h>2 3 int main(void)4 {5   printf("i am testing\n");                                                                                                                                     6   return 0;7 }

运行以上代码……

使用命令echo $?显示退出码

正常退出的退出码为0,错误退出的退出码为非0

退出码反应了进程退出的原因。所以有必要知道这些退出码究竟代表着什么。
strerror()函数的作用就是以字符的形式返回退出码

//所在头文件
<string.h>
//函数原型
char* strerror(int errNum);
 //可以使用下面代码查看退出码对应的信息1 # include <stdio.h>2 # include <string.h>3 4 int main(void)5 {6   for(int i = 0; i < 135; i++)                                                                                                                                  7   {8     printf("%d: %s\n", i, strerror(i));9   }10   return 0;11 }

Linux系统上一共有134个退出码,退出码“134”就已经不认识它了。

0: Success
1: Operation not permitted
2: No such file or directory
3: No such process
4: Interrupted system call
5: Input/output error
6: No such device or address
7: Argument list too long
8: Exec format error
9: Bad file descriptor
10: No child processes
11: Resource temporarily unavailable
12: Cannot allocate memory
13: Permission denied
14: Bad address
15: Block device required
16: Device or resource busy
17: File exists
18: Invalid cross-device link
19: No such device
20: Not a directory
21: Is a directory
22: Invalid argument
23: Too many open files in system
24: Too many open files
25: Inappropriate ioctl for device
26: Text file busy
27: File too large
28: No space left on device
29: Illegal seek
30: Read-only file system
31: Too many links
32: Broken pipe
33: Numerical argument out of domain
34: Numerical result out of range
35: Resource deadlock avoided
36: File name too long
37: No locks available
38: Function not implemented
39: Directory not empty
40: Too many levels of symbolic links
41: Unknown error 41
42: No message of desired type
43: Identifier removed
44: Channel number out of range
45: Level 2 not synchronized
46: Level 3 halted
47: Level 3 reset
48: Link number out of range
49: Protocol driver not attached
50: No CSI structure available
51: Level 2 halted
52: Invalid exchange
53: Invalid request descriptor
54: Exchange full
55: No anode
56: Invalid request code
57: Invalid slot
58: Unknown error 58
59: Bad font file format
60: Device not a stream
61: No data available
62: Timer expired
63: Out of streams resources
64: Machine is not on the network
65: Package not installed
66: Object is remote
67: Link has been severed
68: Advertise error
69: Srmount error
70: Communication error on send
71: Protocol error
72: Multihop attempted
73: RFS specific error
74: Bad message
75: Value too large for defined data type
76: Name not unique on network
77: File descriptor in bad state
78: Remote address changed
79: Can not access a needed shared library
80: Accessing a corrupted shared library
81: .lib section in a.out corrupted
82: Attempting to link in too many shared libraries
83: Cannot exec a shared library directly
84: Invalid or incomplete multibyte or wide character
85: Interrupted system call should be restarted
86: Streams pipe error
87: Too many users
88: Socket operation on non-socket
89: Destination address required
90: Message too long
91: Protocol wrong type for socket
92: Protocol not available
93: Protocol not supported
94: Socket type not supported
95: Operation not supported
96: Protocol family not supported
97: Address family not supported by protocol
98: Address already in use
99: Cannot assign requested address
100: Network is down
101: Network is unreachable
102: Network dropped connection on reset
103: Software caused connection abort
104: Connection reset by peer
105: No buffer space available
106: Transport endpoint is already connected
107: Transport endpoint is not connected
108: Cannot send after transport endpoint shutdown
109: Too many references: cannot splice
110: Connection timed out
111: Connection refused
112: Host is down
113: No route to host
114: Operation already in progress
115: Operation now in progress
116: Stale file handle
117: Structure needs cleaning
118: Not a XENIX named type file
119: No XENIX semaphores available
120: Is a named type file
121: Remote I/O error
122: Disk quota exceeded
123: No medium found
124: Wrong medium type
125: Operation canceled
126: Required key not available
127: Key has expired
128: Key has been revoked
129: Key was rejected by service
130: Owner died
131: State not recoverable
132: Operation not possible due to RF-kill
133: Memory page has hardware error
134: Unknown error 134

Linux上一切皆为文件,指令也是一个文件,当使用不存在的指令时,就会出现报错信息。

其退出码为2,退出码2代表的含义为: No such file or directory(没有这样的文件或目录)


进程退出的几种方法

正常终止的3种方法:

  • main函数返回
  • 调用exit
  • 调用_exit

最常见的进程终止莫过于main函数返回了!需要注意main函数中返回才是进程退出,而非main函数返回并不能正常终止进程,只是函数返回。
【调用exit】

//所在头文件#include <stdlib.h>//exit函数原型void exit(int status);

exit函数是语言层面的函数,是对系统调用函数_exit的封装。
它可以在main函数中调用,也可以在非main函数中调用,都可以达到终止进程的目的。
C标准还规定了两个宏EXIT_SUCCESSEXIT_FAILURE可以作为exit的参数,用来指示这个进程是正常退出还是错误退出。

  1 # include <stdio.h>2 # include <string.h>3 # include <stdlib.h>4 5 int main(void)6 {7   printf("i am testing\n");8   exit(EXIT_SUCCESS);                                                                                                                                           9   return 0;10 }

  1 # include <stdio.h>2 # include <string.h>3 # include <stdlib.h>4 5 int main(void)6 {7   printf("i am testing\n");8   exit(EXIT_FAILURE);     //修改exit函数的参数                                                                                                                                      9   return 0;10 }

【调用_exit函数】

//所在头文件
#include <unistd.h>
//_exit函数原型
void _exit(int status);

_exit是系统调用函数。_exit函数的本质就是调用了系统调用函数_exit。
exit函数封装了系统调用_exit,exit函数还做了其他的事情。

  1 # include <stdio.h>2 # include <string.h>3 # include <stdlib.h>4 # include <unistd.h>5 6 int main(void)7 {8   printf("i am testing"); //没有“\n”9   sleep(2);10   exit(EXIT_SUCCESS);11   return 0;                                                                                                                                                     12 }

代码运行的现象:休眠2秒后,在屏幕上打印“i am testing”.

因此,可以看出,exit函数会冲刷缓冲区……
现在换做_exit函数来终止进程。

  1 # include <stdio.h>2 # include <string.h>3 # include <stdlib.h>4 # include <unistd.h>5 6 int main(void)7 {8   printf("i am testing"); //没有“\n”9   sleep(2);10   _exit(EXIT_SUCCESS);11   return 0;                                                                                                                                                     12 }

代码运行的现象:休眠两秒后,并没有在屏幕上显示预期的“i am testing”,就终止进程了。

因此可看出,_exit函数并不会冲刷缓冲区……

实际上,_exit系统调用函数只是简单地终止了进程,并不会做其他的工作。而exit函数在调用_exit函数之前还会做一些其他的工作:

  • 执行用户定义的清理函数
  • 冲刷缓冲区,关闭所有的流等。
  • 调用_exit函数

main函数返回,本质上是把返回值作为参数传给exit函数,最后还是调用exit函数。

进程控制--->进程终止相关推荐

  1. Linux——详解进程控制之终止

    目录 一.进程终止概念 二.return.exit()._exit()含义使用与相互关系 ①_exit() ②exit() ③return ④相互关系 三.查看终止信息 ①strerror ②echo ...

  2. 【Linux】进程控制 —— 进程创建/终止/等待

    目录 一.进程创建 1.fork创建子进程,操作系统做了什么? 2.fork的用法以及失败的原因 二.进程终止 1.三种退出情况 2.main函数为什么一般情况下都要return 0 3.进程的退出码 ...

  3. 操作系统学习笔记02【进程控制——进程互斥的硬件实现方法】【自用】

    1.进程控制 什么是进程控制? 如何实现进程控制: 为了避免把某一进程pbc从一个队列转移到另一个队列,但是并没有把pbc内的状态标志改为新的对应状态,从而导致pcb的状态标志与实际所处队列不一样这一 ...

  4. Linux - 进程控制(进程替换)

    0.引入 创建子进程的目的是什么? 就是为了让子进程帮我执行特定的任务 让子进程执行父进程的一部分代码 如果子进程想执行一个全新的程序代码呢? 那么就要使用进程的程序替换 为什么要有程序替换? 也就是 ...

  5. 进程控制——进程等待,程序替换

    目录 1.进程等待 1.1进程等待必要性 1.2进程等待的方法 1.3获取子进程status ​2.程序替换 2.1替换原理 2.2替换函数 2.3execl使用实例: 2.4 minishell实现 ...

  6. 【Linux】进程控制 — 进程终止 + 进程等待

    文章目录

  7. 【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

    柴犬: 你好啊,屏幕前的大帅哥or大美女,和我一起享受美好的今天叭

  8. 模拟进程创建、终止、阻塞、唤醒原语_操作系统基础8-进程及进程控制

    进程(Process) 的定义 从不同的角度,进程可以有不同的定义,传统典型的定义: 进程是程序的一次执行过程. 或者:一个正在执行的程序的实例 进程是一个程序及其数据在处理机上顺序执行所发生的活动 ...

  9. 进程控制—终止和等待

    进程控制 进程终止 进程退出场景 退出码 错误码 退出程序 exit return _exit 总结 进程等待 进程等待必要性 等待命令 wait waitpid 退出状态 阻塞等待 进程终止 进程退 ...

  10. 进程控制概念简介 多线程上篇(三)

    进程控制 进程的基本数据信息是操作系统控制管理进程的数据集合,这些信息就是用来控制进程的,此处我们说的进程控制就是进程的管理. 比如进程有状态,那么进程的创建.终止,状态的切换,这都不是进程自主进行的 ...

最新文章

  1. 学习API网关遇到的名词
  2. 7怎么导入中文文献_如何下载并引用参考文献?
  3. 解题报告:P5960 【模板】差分约束算法(及常用技巧)
  4. 统计apache404错误ip并加入iptables防火墙
  5. python实战-pdf文件转txt
  6. 限时秒杀┃月销10000+件,风靡全国的steam科学实验套装
  7. 在c语言中,字符串topt65的长度是,谭浩强c__程序设计第13章.ppt
  8. Python | 常见的反爬及解决方法,值得收藏
  9. 前大厂员工谈中美企业区别,中企不用单元测试,仅靠QA检查代码?
  10. windows查看linux文件工具,「实用工具」介绍几款Windows系统与Linux服务器传递文件的工具...
  11. 下载python教程-python教程pdf下载
  12. DFS/并查集 Codeforces Round #286 (Div. 2) B - Mr. Kitayuta's Colorful Graph
  13. 正则去除汉字和只取数字
  14. EasyPR 环境配置
  15. BUUCTF crackMe 题解
  16. 如何用photoshop做24色环_怎么使用PS制作24色环?
  17. 再捐1亿元种树治沙:蚂蚁集团持续七年支持内蒙古生态治理
  18. 人生是一个连续的过程,没什么东西能影响人的一生,怎么选择不是问题。问题是每天都要努力 (转)...
  19. python关键词对联_对联数据
  20. iPhone中国移动收不到彩信,联通不用设置都可以,具体设置方法:

热门文章

  1. 月饼门,郭德纲,价值观
  2. 谈谈法师如何单挑战士
  3. 如何采集淘宝同行店铺商品的步骤?
  4. mysql 多数据源与事务嵌套不兼容解决方案
  5. sublime text 3激活汉化
  6. 阿里巴巴高管换血,吴永明接替张勇
  7. 【天光学术】主题班会讲话稿:勤俭节约,打造低碳生活
  8. 【先楫HPM6750系列】CoreMark跑分测试
  9. 《4D移花接木——镜中花》设计方案
  10. 【macOS付费软件推荐】第3期:Sibelius Ultimate