網(wǎng)站首頁 編程語言 正文
進程退出的形式
進程退出的幾種情況
- 正常退出(自愿,代碼運行完其結果正確)
- 錯誤退出(自愿,代碼運行完其結果不正確)
- 異常退出(非自愿,代碼異常直接終止)
- 被其他進程終止(非自愿)
自愿退出會返回一個退出碼,由父進程接收。
在Linux上可以使用命令echo $?
顯示最近一次退出的進程返回的退出碼
//現(xiàn)有如下代碼,源文件名為mycode.c # include <stdio.h> int main(void) { printf("i am testing\n"); return 0; }
運行以上代碼……
使用命令echo $?
顯示退出碼
正常退出的退出碼為0,錯誤退出的退出碼為非0
退出碼反應了進程退出的原因。所以有必要知道這些退出碼究竟代表著什么。
strerror()
函數(shù)的作用就是以字符的形式返回退出碼。
//所在頭文件 <string.h> //函數(shù)原型 char* strerror(int errNum);
//可以使用下面代碼查看退出碼對應的信息 # include <stdio.h> # include <string.h> int main(void) { for(int i = 0; i < 135; i++) { printf("%d: %s\n", i, strerror(i)); } return 0; }
Linux系統(tǒng)上一共有134個退出碼,退出碼“134”就已經(jīng)不認識它了。
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上一切皆為文件,指令也是一個文件,當使用不存在的指令時,就會出現(xiàn)報錯信息。
其退出碼為2,退出碼2代表的含義為: No such file or directory(沒有這樣的文件或目錄)
進程退出的幾種方法
正常終止的3種方法:
- main函數(shù)返回
- 調用exit
- 調用_exit
最常見的進程終止莫過于main函數(shù)返回了!需要注意main函數(shù)中返回才是進程退出,而非main函數(shù)返回并不能正常終止進程,只是函數(shù)返回。
【調用exit】
//所在頭文件 #include <stdlib.h> //exit函數(shù)原型 void exit(int status);
exit函數(shù)是語言層面的函數(shù),是對系統(tǒng)調用函數(shù)_exit的封裝。
它可以在main函數(shù)中調用,也可以在非main函數(shù)中調用,都可以達到終止進程的目的。
C標準還規(guī)定了兩個宏EXIT_SUCCESS和EXIT_FAILURE可以作為exit的參數(shù),用來指示這個進程是正常退出還是錯誤退出。
# include <stdio.h> # include <string.h> # include <stdlib.h> int main(void) { printf("i am testing\n"); exit(EXIT_SUCCESS); return 0; }
# include <stdio.h> # include <string.h> # include <stdlib.h> int main(void) { printf("i am testing\n"); exit(EXIT_FAILURE); //修改exit函數(shù)的參數(shù) return 0; }
【調用_exit函數(shù)】
//所在頭文件 #include <unistd.h> //_exit函數(shù)原型 void _exit(int status);
_exit是系統(tǒng)調用函數(shù)。_exit函數(shù)的本質就是調用了系統(tǒng)調用函數(shù)_exit。
exit函數(shù)封裝了系統(tǒng)調用_exit,exit函數(shù)還做了其他的事情。
# include <stdio.h> # include <string.h> # include <stdlib.h> # include <unistd.h> int main(void) { printf("i am testing"); //沒有“\n” sleep(2); exit(EXIT_SUCCESS); return 0; }
代碼運行的現(xiàn)象:休眠2秒后,在屏幕上打印“i am testing”.
因此,可以看出,exit函數(shù)會沖刷緩沖區(qū)……
現(xiàn)在換做_exit函數(shù)來終止進程。
# include <stdio.h> # include <string.h> # include <stdlib.h> # include <unistd.h> int main(void) { printf("i am testing"); //沒有“\n” sleep(2); _exit(EXIT_SUCCESS); return 0; }
代碼運行的現(xiàn)象:休眠兩秒后,并沒有在屏幕上顯示預期的“i am testing”,就終止進程了。
因此可看出,_exit函數(shù)并不會沖刷緩沖區(qū)……
實際上,_exit系統(tǒng)調用函數(shù)只是簡單地終止了進程,并不會做其他的工作。而exit函數(shù)在調用_exit函數(shù)之前還會做一些其他的工作:
- 執(zhí)行用戶定義的清理函數(shù)
- 沖刷緩沖區(qū),關閉所有的流等。
- 調用_exit函數(shù)
main函數(shù)返回,本質上是把返回值作為參數(shù)傳給exit函數(shù),最后還是調用exit函數(shù)。
原文鏈接:https://blog.csdn.net/qq_56870066/article/details/125172688
相關推薦
- 2022-11-15 Python正則表達式re.search()用法詳解_python
- 2022-05-06 Python如何判斷字符串是否僅包含數(shù)字_python
- 2022-05-21 k8s監(jiān)控數(shù)據(jù)組件Pod自動化進行擴縮容HPA_服務器其它
- 2022-05-06 SQL獲取數(shù)據(jù)庫中表信息:表名、建表時間、總行數(shù)、數(shù)據(jù)大小等
- 2022-09-01 C#通過System.CommandLine快速生成支持命令行的應用程序_C#教程
- 2022-06-22 SQL實現(xiàn)篩選出連續(xù)3天登錄用戶與窗口函數(shù)的示例代碼_MsSql
- 2023-07-27 原型和原型鏈條、ES6、前后端交互Ajax
- 2024-04-07 Linux如何查看當前占用CPU和內存最多的進程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支