[英]How to construct a string for a Unix system() call from C program
我試圖讓我的C程序使用system()
在Unix中運行命令。
我可以制作類似system("stat myFile")
,其中myFile
是程序中的變量嗎? 還有其他辦法嗎?
system()
采用指向char的指針或char數組。 您可以按以下方式構造它:
#include <stdio.h>
#include <stdlib.h>
char command[256]; /* Big enough for "stat " + longest file name. */
char *myFile = "/my/file";
/* ... */
sprintf (command, "stat %s", myFile);
system(commmand);
這應該可以幫助您,但是請注意,如果myFile
是一個looooong名稱,則硬限制(例如256)不是防彈編碼,因為可能會導致緩沖區溢出。 Supercalifragilisticexpialidocious文件名不是聞所未聞的:-)如果您想像專業人士一樣去做,下一步就是閱讀snprintf
手冊,並向您的shell詢問getconf _POSIX_PATH_MAX
。
簡短的答案: 不要 。 system
有很多您不想處理的問題:
它通過外殼程序運行外部程序,因此您必須擔心在構建字符串時是否正確轉義了傳遞的任何文件名或其他選項。 否則可能會造成危險的錯誤。
system
暫停您的程序,直到您運行的程序完成。
無法從通過system
運行的程序中讀取輸出。
使用popen
解決了除外殼轉義之外的所有問題,非常方便。 使用fork
和execvp
或posix_spawnp
更為復雜,但可以解決上述所有問題,甚至更多。
對於運行stat(1)命令的特定情況,可以改為使用stat(2) syscall。 參見syscalls(2) 。 因此使用
struct stat mys;
memset (&mys, 0, sizeof(mys));
if (stat(filename, &mys)) { perror(filename); exit(EXIT_FAILURE); };
/// use mys
通常,您可能會考慮使用snprintf(3)或asprintf(3)來構建命令字符串,並使用popen(3)或system(3)來運行它。 如果您可以避免這種情況,則不建議這樣做(可以進行代碼注入 ,因此需要考慮shell換碼等)。
您還應該閱讀Advanced Linux Programming ,也許要了解fork(2) , execve(2) , pipe(2)等...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.