c程式呼叫shell指令碼共有三種方式:system()、popen()、exec系列函式
1)system(shell命令或shell指令碼路徑);
執行過程:system()會呼叫fork()產生子程序,由子程序來呼叫/bin/sh-c string來執行引數string
字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。在呼叫system()期間sigchld
訊號會被暫時擱置,sigint和sigquit 訊號則會被忽略。
返回值:如果system()在呼叫/bin/sh時失敗則返回127,其他失敗原因返回-1。若引數string為
空指標(null),則返回非零值。如果 system()呼叫成功則最後會返回執行shell命令後的返回
值,但是此返回值也有可能為system()呼叫/bin/sh失敗所返回的127,因此最好能再檢查errno
來確認執行成功。
注意:在編寫具有suid/sgid許可權的程式時最好不要使用system(),system()會繼承環境變
量,通過環境變數可能會造成系統安全的問題。
例:在~/myprogram/目錄下有shell指令碼test.sh,內容為
#!bin/bash
#test.sh
echo $home
在該目錄下新建乙個c檔案systemtest.c,內容為:
#include
/*this program is used to test function system*/
main()
執行結果如下:
xiakeyou@ubuntu:~/myprogram$ gcc systemtest.c -o systemtest
xiakeyou@ubuntu:~/myprogram$ ./systemtest
/home/d/e/xiakeyou
xiakeyou@ubuntu:~/myprogram$
2)popen(char *command,char *type)
執行過程:popen()會呼叫fork()產生子程序,然後從子程序中呼叫/bin/sh -c來執行引數
command的指令。引數type可使用「r」代表讀取,「w」代表寫入。依照此type值,popen()
會建立管道連到子程序的標準輸出裝置或標準輸入裝置,然後返回乙個檔案指標。隨後程序便
可利用此檔案指標來讀取子程序的輸出裝置或是寫入到子程序的標準輸入裝置中。此外,所有
使用檔案指標(file*)操作的函式也都可以使用,除了fclose()以外。
返回值:若成功則返回檔案指標,否則返回null,錯誤原因存於errno中。
注意:在編寫具suid/sgid許可權的程式時請盡量避免使用popen(),popen()會繼承環境變數,
通過環境變數可能會造成系統安全的問題。
例:c程式popentest.c內容如下:
#include
main()
執行結果如下:
xiakeyou@ubuntu:~/myprogram$ vim popentest.c
xiakeyou@ubuntu:~/myprogram$ gcc popentest.c -o popentest
xiakeyou@ubuntu:~/myprogram$ ./popentest
/home/d/e/xiakeyou
xiakeyou@ubuntu:~/myprogram$
python 如何呼叫帶引數的shell指令碼
舉例 shell的指令碼 t.sh內容 echo this is a test shell with arguments echo arg1 1 arg2 2 執行指令碼.t.sh zhao 結果如下 noncode gnode108 knockdown workflow t.sh zhao1 zh...
Linux Makefile與shell指令碼區別
在makefile可以呼叫shell指令碼,但是makefile和shell指令碼是不同的。本文試著歸納一下makefile和shell指令碼的不同。1 shell中所有引用以 打頭的變數其後要加 而在makefile中的變數是以 打頭的後加 例項如下 makefile path data subp...
shell函式的呼叫執行
要想呼叫執行自己編寫的shell檔案中的函式,有如下方法 比如,自己編寫了乙個test.sh檔案如下,test.sh bin sh echo line echo line 要想在shell裡呼叫echo line 和echo line 方法,首先需要註冊test.sh到當前shell 命令 test...