1. 程式人生 > >C語言中呼叫系統命令(system popen...)

C語言中呼叫系統命令(system popen...)

1、system(執行shell 命令)

相關函式 fork,execve,waitpid,popen
表頭檔案 #include<stdlib.h>
定義函式 int system(const char * string);
函式說明 system()會呼叫fork()產生子程序,由子程序來呼叫/bin/sh-cstring來執行引數string字串所代表的命令,此命令執行完後隨
即返回原呼叫的程序。在呼叫system()期間SIGCHLD 訊號會被暫時擱置,SIGINT和SIGQUIT 訊號則會被忽略。返回值 如果system()在呼叫/bin/sh時失敗則返回127,其他失敗原因返回-

1。若引數string為空指標(NULL),則返回非零值。如果system()呼叫成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能為system()呼叫/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。附加說明 在編寫具有SUID/SGID許可權的程式時請勿使用system(),system()會繼承環境變數,通過環境變數可能會造成系統安全的問題。

範例:

#include<stdlib.h>
main()
{
system(“ls
-al /etc/passwd /etc/shadow”);
}

2、popen(建立管道I/O)

相關函式 pipe,mkfifo,pclose,fork,system,fopen
表頭檔案 #include<stdio.h>
定義函式 FILE * popen( const char * command,const char * type);
函式說明 popen()會呼叫fork()產生子程序,然後從子程序中呼叫/bin/sh -c來執行引數command的指令。引數type可使用“r”代表讀取,“w”

代表寫入。依照此type值,popen()會建立管道連到子程序的標準輸出裝置或標準輸入裝置,然後返回一個檔案指標。隨後程序便可利用此檔案指標來讀取子程序的輸出裝置或是寫入到子程序的標準輸入裝置中。此外,所有使用檔案指標(FILE*)操作的函式也都可以使用,除了fclose()以外。返回值 若成功則返回檔案指標,否則返回NULL,錯誤原因存於errno中。錯誤程式碼 EINVAL引數type不合法。注意事項 在編寫具SUID/SGID許可權的程式時請儘量避免使用popen(),popen()會繼承環境變數,通過環境變數可能會造成系統安全的問題。

範例:

#include<stdio.h>
main() { FILE * fp; char buffer[80]; fp=popen(“cat /etc/passwd”,”r”); fgets(buffer,sizeof(buffer),fp); printf(“%s”,buffer); pclose(fp); }

執行 root :x:0 0: root: /root: /bin/bash

3、使用vfork()新建子程序,然後呼叫exec函式族

#include<unistd.h>
main()
{
char* argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) };

if(vfork() ==0)
{
execv(“
/bin/ls”,argv);
}
else{
printf(“This
is the parent process\n”);
}
}