程序管理之system

2022-03-17 02:58:04 字數 2104 閱讀 5081

#includeint system(const char *command);
首先要知道,system函式是c庫中的函式,而不是系統呼叫。其實system函式使用起來並不複雜,難就難在對其返回值的理解。這個問題,下文會詳細分析。引數的話,很簡單,就是終端的命令即可。這是因為system函式的實現中呼叫了shell的緣故。

先寫個簡化版的system函式的實現過程。簡化是沒有考慮處理訊號的問題。**如下:

#include#include#includeint system(char * command)

}return status;

}}

1)返回值為 「0」 或 「1」

這中情況一般不會出現,只有當寫成system(null)時,才會出現這種結果。目的是為了檢測系統的shell是否可用。返回1表示shell可用,返回0表示shell不可用;這種情況在上訴**中看不出來,通過glibc庫中的原始碼可以看出:

glibc-2.17/sysdeps/posix/system.c

int __libc_system(const char *line)

line指標指向的就是command命令列引數,system函式呼叫do_system系統呼叫,當執行「exit 0」(表示結束當前shell),執行成功do_system返回0,說明shell可用。反之,shell不可用。

2)返回值為 -1

有兩個原因造成這樣的結果。第一,因為fork建立子程序失敗導致的。即「case -1」的情況,這中情況比較少見;第二,是不能正常處理子程序的「墓誌銘」導致的,說白了,就是子程序的程序表在子程序結束時,沒有經過父程序處理,而自己銷毀了。這樣的效果是因為父程序中安插的處理sigchld訊號的處理函式是sig_ign,或者使用者設定了sa_nocldwait標誌位導致,waitpid函式返回值為-1且全域性變數errno的值為echld;

例如:

signal(sigchld,sig_ign); //出錯的根源

if( (status = system(command)) < 0 )

所以在使用system函式時,一定要判斷sigchld是否被設定為sig_ign。

3)返回值為 _exit(127)的返回值

這種情況是因為程式執行到「case 0」中,execl函式執行失敗後,執行_exit函式導致的。說明子程序無法執行shell該shell命令。

4)返回值為shell執行的程序的返回值

shell的終止狀態是其執行最後一條命令的退出狀態。這種情況下和獲取子程序的退出狀態一樣。通過如下巨集獲取其退出狀態:

綜上所述,可以給出乙個system函式返回值判斷的例程:

if( (status == system(command))==-1 )

else if(wifexited(status)&&wexitstatus(status) == 127)

else

print_wait_exit(status);

print_wait_exit函式就是上文中提到的獲取shell退出狀態的巨集,根據需要去實現即可。

影響system函式執行的訊號有三個:sigchld、sigint和sigquit訊號。

sigchld訊號:上文已經提過,它會影響waitpid函式,產生競爭現象的出現。呼叫system函式的程序可能還有其他的子程序,當然同樣也會有wait或waitpid函式。當有sigchld訊號到來時,system函式中的waitpid函式和其他的wait或waitpid函式產生競爭狀態,從而使得system執行異常。所以system執行期間會暫時遮蔽sigchld訊號;

sigint訊號和sigquit訊號:呼叫system函式的程序會遮蔽這兩個訊號。system函式建立的程序會恢復這兩個訊號的預設處理狀態。呼叫system函式的程序其實已經放棄了控制權,所以不能夠去終止程序。反之,system函式建立的程序當然就有了控制權,所以要恢復控制權。

程序入門之system

linux下system函式的原始碼 include include include include intsystem const char cmdstring if pid fork 0 else if pid 0 else return status system的引數可以很明顯看出來就是在終...

程序控制之system函式

1.system函式 include int system const char cmd 如果cmd是乙個空指標,則僅僅當命令處理程式可用時,system返回非0值。因為system在其實現中呼叫了fork,exec和waitpid,因此有三種返回值 1 如果fork失敗或者waitpid返回除ei...

程序狀態和system函式

朱老師物聯網大講堂 學習筆記 先fork建立子程序,然後子程序接著exec執行自己的程式,程序狀態,就緒態,即我準備好了,執行態,就緒態得到cpu就進入執行態開始執行,殭屍態,等待態,等待某個資源,又可以細分為淺度睡眠和深度睡眠,停止態,暫停了,可以被喚醒,源自 system函式,相當於fork e...