最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Shell程序退出狀態(tài)碼的命令詳解

 更新時間:2022年10月24日 08:33:15   作者:一無是處的研究僧  
在本篇文章當(dāng)中主要給大家介紹一個shell的小知識——狀態(tài)碼。這是當(dāng)我們的程序退出的時候,子進程會將自己程序的退出碼傳遞給父進程,有時候我們可以利用這一操作做一些進程退出之后的事情,比如當(dāng)程序執(zhí)行失敗或者被某個信號殺死我們就可以了解到,然后做出對應(yīng)的措施

在本篇文章當(dāng)中主要給大家介紹了一些常見的程序退出的狀態(tài)碼!并且給出一下例子幫助大家仔細(xì)理解,并且使用C語言和python語言實現(xiàn)獲取子進程退出時候的退出狀態(tài)碼。

程序退出狀態(tài)碼

前言

在本篇文章當(dāng)中主要給大家介紹一個shell的小知識——狀態(tài)碼。這是當(dāng)我們的程序退出的時候,子進程會將自己程序的退出碼傳遞給父進程,有時候我們可以利用這一操作做一些進程退出之后的事情,比如當(dāng)程序執(zhí)行失敗或者被某個信號殺死我們就可以了解到,然后做出對應(yīng)的措施。

狀態(tài)碼簡介

上圖是一個zsh的截圖,當(dāng)我們執(zhí)行命令asdsad之后,因為沒有這個命令,所以zsh(類似于bash的一種shell),輸出沒有找到這個命令,但是我們發(fā)現(xiàn)圖中箭頭??由綠色變成紅色,表示程序不是正常退出?,F(xiàn)在有一個問題是,zsh是怎么知道程序不是正常退出的呢?其實就可以根據(jù)子進程退出的狀態(tài)推斷。在文章的最后我們用C語言實現(xiàn)一下,看看如果在父進程接收子進程的退出的狀態(tài)。

我們在命令行當(dāng)中可以通過命令 echo $? 查看上一個進程退出時候的退出碼,這里的上一個進程就是 ls 命令:

程序正常退出的時候退出碼等于0。

退出碼表

退出碼含義例子解釋
1一般的錯誤除以0一般的除以0的錯誤,執(zhí)行沒有權(quán)限的操作
2shell 內(nèi)部操作失敗 通常是shell操作時候的命令錯誤,文章后面有一個例子演示
126執(zhí)行不能夠執(zhí)行的文件/dev/random權(quán)限問題或者命令不能夠執(zhí)行
127命令沒有找到非法或者不存在的命令執(zhí)行一個系統(tǒng)當(dāng)中不存在的命令,可以通過設(shè)置PATH環(huán)境變量
128+n錯誤的信號值Kill -9 PID殺死進程號為PID的進程,進程的退出碼等于 128 + 9
130ctrl+c 之后進程的返回值 和上一條一樣ctrl+c的信號值等于2
其他退出碼s不在范圍之內(nèi)exit(-1)如果退出碼n不在0-255之內(nèi),那么程序退出之后的退出碼為n&255,并且取低8位作為最終的結(jié)果

實例說明

退出碼——1

除以0

執(zhí)行沒有權(quán)限的操作

上面直接進入root用戶的目錄,因為沒有權(quán)限,查看進程的退出碼等于1。

shell內(nèi)部操作失敗——退出碼2

a=1
if [ $a -eq 1 ]
then
  echo hello world

比如對于上面的shell腳本是有語法錯誤的正確的語法還需要在最后加上fi,現(xiàn)在我們執(zhí)行上面的腳本查看結(jié)果:

退出碼126

當(dāng)因為權(quán)限問題或者命令不可以執(zhí)行那么進程的退出碼就是126:

命令沒有找到——退出碼127

信號值——128+n(信號對應(yīng)的數(shù)值)

我們可以使用kil -l 命令查看 linux 操作系統(tǒng)當(dāng)中信號以及對應(yīng)的數(shù)值:

 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX

當(dāng)我們在命令行使用ctrl+c中斷程序的執(zhí)行的時候,這個正在執(zhí)行的進程就會接受到SIGINT信號,根據(jù)上文這個信號對應(yīng)的數(shù)值為2,因此程序的退出碼等于130(128 + 2)。

下面是一個通過kill命令發(fā)送對應(yīng)的信號的例子:

可以看到的程序的退出碼是符號我們的預(yù)期的。

不在范圍內(nèi)不的退出碼

不在范圍內(nèi)(0-255)的退出碼,需要和 0xff 進行 & 操作,得到的結(jié)果作為無符號數(shù)作為最終的程序的退出碼!

在上面的例子當(dāng)中退出碼256的二進制表示 1_0000_0000 他和 255(二進制表示為1111_1111)進行與操作得到的結(jié)果為1_0000_000,低8位等于0000_0000,因此最終的退出碼等于0。

在上面的圖當(dāng)中-1的二進制表示等于1111_1111 因此最后得到的退出碼等于1111_1111 = 255。

C/Python語言獲取進程退出的狀態(tài)碼

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
 
int main() {
 
  if(fork() ==  0) {
    _exit(1);  // 子進程執(zhí)行
  } else {
    // 父進程執(zhí)行
    int status;
    wait(&status);         // WEXITSTATUS 這個宏就是獲取子進程退出時候的退出碼
    printf("status = %d\n", WEXITSTATUS(status));
  } 
  return 0;
}

在上面的代碼當(dāng)中父進程執(zhí)行的 wait 函數(shù)就是等待子進程的狀態(tài)變化,當(dāng)子進程退出的時候 wait 函數(shù)會返回,同時將子進程一些狀態(tài)信息保存在 status 當(dāng)中,然后我們就可以子進程傳遞給父進程最后的信息啦。其中 WEXITSTATUS 這個宏就是獲取子進程退出時候的退出碼!對應(yīng)的 python 實現(xiàn)如下圖所示:

import os
import sys
 
if __name__ == '__main__':
    pid = os.fork()
    if pid == 0:
        sys.exit(-1)
    else:
        pid, status = os.wait()
        print(os.WEXITSTATUS(status))

總結(jié)

在本篇文章當(dāng)中主要給大家介紹了一些常見的程序退出的狀態(tài)碼!并且給出一下例子幫助大家仔細(xì)理解,并且使用C語言和python語言實現(xiàn)獲取子進程退出時候的退出狀態(tài)碼。

以上就是本篇文章的所有內(nèi)容了,我是LeHung,我們下期再見!??!更多精彩內(nèi)容合集可訪問項目:https://github.com/Chang-LeHung/CSCore

到此這篇關(guān)于Shell程序退出狀態(tài)碼的文章就介紹到這了,更多相關(guān)Shell退出狀態(tài)碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

德格县| 类乌齐县| 门源| 榆林市| 什邡市| 房山区| 新密市| 宁武县| 福建省| 岳阳县| 望江县| 乐东| 藁城市| 巴青县| 蒲江县| 石棉县| 通州市| 尼勒克县| 临西县| 灯塔市| 永春县| 涪陵区| 唐山市| 军事| 康定县| 萨迦县| 杭州市| 高阳县| 兴隆县| 建始县| 隆回县| 宽甸| 翁源县| 黔江区| 秦皇岛市| 郓城县| 西华县| 霍州市| 黔西| 泰和县| 和顺县|