簡體   English   中英

如何從C程序為Unix system()調用構造字符串

[英]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有很多您不想處理的問題:

  1. 它通過外殼程序運行外部程序,因此您必須擔心在構建字符串時是否正確轉義了傳遞的任何文件名或其他選項。 否則可能會造成危險的錯誤。

  2. system暫停您的程序,直到您運行的程序完成。

  3. 無法從通過system運行的程序中讀取輸出。

使用popen解決了除外殼轉義之外的所有問題,非常方便。 使用forkexecvpposix_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM