linux system系統呼叫
阿新 • • 發佈:2018-12-26
為了簡化執行命令的複雜程度,Linux系統提供system
系統呼叫,原理是通過fork
的方式產生一個子程序,在這個子程序中執行系統呼叫過程中引數裡面設定的command
。
system函式
#include <stdlib.h>
int system(const char *command);
功能:
利用fork
建立子程序,然後用execl來執行/bin/sh sh -c command
指令。system
函式的主程序必須等待子程序執行完後再退出,並返回執行狀態。
引數:
command
:需要執行的命令的字串,比如需要檢視當前目錄下的檔案資訊,則將command
設定為ls -l
。
返回值:
-
出現異常時返回
-1
; -
子程序正常退出,返回
0
或者其他值。
實際上system()函式執行了三步操作:
-
fork一個子程序;
-
在子程序中呼叫
exec
函式去執行command
; -
在父程序中呼叫
wait
去等待子程序結束。對於fork失敗,system
()函式返回-1。如果exec
執行成功,則返回command
通過exit
或return
返回的值。
函式原始碼:
int system(const char * cmdstring) { pid_t pid; int status; if(cmdstring == NULL){ return (1); } if((pid = fork())<0){ status = -1; } else if(pid == 0){ execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); _exit(127); //子程序正常執行則不會執行此語句 } else{ while(waitpid(pid, &status, 0) < 0){ if(errno != EINTER){ status = -1; break; } } } return status; }
例項:
程式設計要求
在主函式的最開始會初始化一個全部變數g_i4event
為0
。
本關的程式設計任務是補全右側程式碼片段中Begin
至End
中間的程式碼,具體要求如下:
-
執行“touch test.dat”命令;
-
檢查命令是否執行成功,如果執行成功,則將
g_i4event
設為1
; -
執行成功返回
0
,執行失敗返回-1
。
測試樣例:
測試輸入:
預期輸出:touch ./test.dat successful!
system command executed successful!
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <pthread.h> #include <sys/types.h> #include <dirent.h> pthread_t pid; int g_i4event = 0; int do_system(void); int do_system(void) { /********Begin********/ if(system("touch test.dat")!=-1) { g_i4event=1; return 0; } return -1; /*********End*********/ } void *detect(void *arg) { int count = 0; while (1) { if(access("./test.dat", F_OK)) { count ++; } switch(g_i4event) { case 0: break; case 1: count ++; if(1 == count) { printf("system command executed successful!\n"); } return NULL; default: break; } g_i4event = 0; usleep(10 * 1000); } return NULL; } int main(int argc, char *argv[]) { pthread_create(&pid, NULL, detect, NULL); if(0 == do_system()) { printf("touch ./test.dat successful!\n"); } else { printf("touch ./test.dat failed!\n"); } pthread_join(pid, NULL); return 0; }