亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言詳解分析進(jìn)程控制中進(jìn)程終止的實現(xiàn)

 更新時間:2022年08月29日 09:48:29   作者:小小酥誒  
當(dāng)進(jìn)程完成執(zhí)行最后語句并且通過系統(tǒng)調(diào)用 exit() 請求操作系統(tǒng)刪除自身時,進(jìn)程終止。這時,進(jìn)程可以返回狀態(tài)值(通常為整數(shù))到父進(jìn)程(通過系統(tǒng)調(diào)用 wait())。所有進(jìn)程資源,如物理和虛擬內(nèi)存、打開文件和 I/O 緩沖區(qū)等,會由操作系統(tǒng)釋放

進(jìn)程退出的形式

進(jìn)程退出的幾種情況

  • 正常退出(自愿,代碼運行完其結(jié)果正確)
  • 錯誤退出(自愿,代碼運行完其結(jié)果不正確)
  • 異常退出(非自愿,代碼異常直接終止)
  • 被其他進(jìn)程終止(非自愿)

自愿退出會返回一個退出碼,由父進(jìn)程接收。

在Linux上可以使用命令echo $?顯示最近一次退出的進(jìn)程返回的退出碼

  //現(xiàn)有如下代碼,源文件名為mycode.c
 # include <stdio.h>
 int main(void)
 {
   printf("i am testing\n");                                                                                                                                     
   return 0;
 }

運行以上代碼……

使用命令echo $?顯示退出碼

正常退出的退出碼為0,錯誤退出的退出碼為非0

退出碼反應(yīng)了進(jìn)程退出的原因。所以有必要知道這些退出碼究竟代表著什么。

strerror()函數(shù)的作用就是以字符的形式返回退出碼。

//所在頭文件
<string.h>
//函數(shù)原型
char* strerror(int errNum);
//可以使用下面代碼查看退出碼對應(yīng)的信息
 # 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)不認(rèn)識它了。

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上一切皆為文件,指令也是一個文件,當(dāng)使用不存在的指令時,就會出現(xiàn)報錯信息。

其退出碼為2,退出碼2代表的含義為: No such file or directory(沒有這樣的文件或目錄)

進(jìn)程退出的幾種方法

正常終止的3種方法:

  • main函數(shù)返回
  • 調(diào)用exit
  • 調(diào)用_exit

最常見的進(jìn)程終止莫過于main函數(shù)返回了!需要注意main函數(shù)中返回才是進(jìn)程退出,而非main函數(shù)返回并不能正常終止進(jìn)程,只是函數(shù)返回。

【調(diào)用exit】

//所在頭文件
 #include <stdlib.h>
 //exit函數(shù)原型
 void exit(int status);

exit函數(shù)是語言層面的函數(shù),是對系統(tǒng)調(diào)用函數(shù)_exit的封裝。

它可以在main函數(shù)中調(diào)用,也可以在非main函數(shù)中調(diào)用,都可以達(dá)到終止進(jìn)程的目的。

C標(biāo)準(zhǔn)還規(guī)定了兩個宏EXIT_SUCCESS和EXIT_FAILURE可以作為exit的參數(shù),用來指示這個進(jìn)程是正常退出還是錯誤退出。

 # 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;
 }

【調(diào)用_exit函數(shù)】

//所在頭文件
#include <unistd.h>
//_exit函數(shù)原型
void _exit(int status);

_exit是系統(tǒng)調(diào)用函數(shù)。_exit函數(shù)的本質(zhì)就是調(diào)用了系統(tǒng)調(diào)用函數(shù)_exit。

exit函數(shù)封裝了系統(tǒng)調(diào)用_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ù)來終止進(jìn)程。

 # 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)象:休眠兩秒后,并沒有在屏幕上顯示預(yù)期的“i am testing”,就終止進(jìn)程了。

因此可看出,_exit函數(shù)并不會沖刷緩沖區(qū)……

實際上,_exit系統(tǒng)調(diào)用函數(shù)只是簡單地終止了進(jìn)程,并不會做其他的工作。而exit函數(shù)在調(diào)用_exit函數(shù)之前還會做一些其他的工作:

  • 執(zhí)行用戶定義的清理函數(shù)
  • 沖刷緩沖區(qū),關(guān)閉所有的流等。
  • 調(diào)用_exit函數(shù)

main函數(shù)返回,本質(zhì)上是把返回值作為參數(shù)傳給exit函數(shù),最后還是調(diào)用exit函數(shù)。

到此這篇關(guān)于C語言詳解分析進(jìn)程控制中進(jìn)程終止的實現(xiàn)的文章就介紹到這了,更多相關(guān)C語言進(jìn)程終止內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • opencv3/C++視頻中疊加透明圖片的實現(xiàn)

    opencv3/C++視頻中疊加透明圖片的實現(xiàn)

    今天小編就為大家分享一篇opencv3/C++視頻中疊加透明圖片的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++實現(xiàn)簡易的通訊錄管理系統(tǒng)

    C++實現(xiàn)簡易的通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡易的通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實現(xiàn)bmp格式圖像讀寫

    C++實現(xiàn)bmp格式圖像讀寫

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)bmp格式圖像讀寫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • VS2019開發(fā)簡單的C/C++動態(tài)鏈接庫并進(jìn)行調(diào)用的實現(xiàn)

    VS2019開發(fā)簡單的C/C++動態(tài)鏈接庫并進(jìn)行調(diào)用的實現(xiàn)

    這篇文章主要介紹了VS2019開發(fā)簡單的C/C++動態(tài)鏈接庫并進(jìn)行調(diào)用的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C語言代碼實現(xiàn)2048游戲

    C語言代碼實現(xiàn)2048游戲

    這篇文章主要為大家詳細(xì)介紹了C語言代碼實現(xiàn)2048游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Opencv透視變換綜合實例詳解

    Opencv透視變換綜合實例詳解

    這篇文章主要為大家詳細(xì)介紹了Opencv透視變換綜合實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • windows下在vim中搭建c語言開發(fā)環(huán)境的詳細(xì)過程

    windows下在vim中搭建c語言開發(fā)環(huán)境的詳細(xì)過程

    這篇文章主要介紹了windows下在vim中搭建c語言開發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • 最新C語言自定義類型詳解

    最新C語言自定義類型詳解

    生活當(dāng)中有很多物品是不能簡單的用整型、浮點型、字符型來區(qū)分,它們常常是復(fù)雜的集合,比如人,一個人擁有年齡,身高、體重、學(xué)歷......等信息,我們可以用結(jié)構(gòu)體來實現(xiàn)準(zhǔn)確描述人這種復(fù)雜集合,這篇文章主要介紹了C語言?自定義類型,需要的朋友可以參考下
    2023-01-01
  • C語言 90后懷舊游戲超級瑪麗的實現(xiàn)流程

    C語言 90后懷舊游戲超級瑪麗的實現(xiàn)流程

    90后最風(fēng)靡的游戲是什么?第一個聯(lián)想到的肯定是插卡游戲機(jī)或者VCD加光盤運行在電視機(jī)上的超級瑪麗了,它的經(jīng)典絕對可以排在第一位,長大后的我們今天來用C語言重溫一下
    2021-11-11
  • C語言全方位講解指針與地址和數(shù)組函數(shù)堆空間的關(guān)系

    C語言全方位講解指針與地址和數(shù)組函數(shù)堆空間的關(guān)系

    指針是C語言中一個非常重要的概念,也是C語言的特色之一。使用指針可以對復(fù)雜數(shù)據(jù)進(jìn)行處理,能對計算機(jī)的內(nèi)存分配進(jìn)行控制,在函數(shù)調(diào)用中使用指針還可以返回多個值
    2022-04-04

最新評論