如何为C程序中的Unix system()调用构造字符串

如何为C程序中的Unix system()调用构造字符串,c,unix,command,C,Unix,Command,我试图让我的C程序在Unix中使用系统运行命令 我可以制作一些类似systemstat myFile的东西,其中myFile是我程序中的一个变量吗? 还有其他可能的方法吗?系统采用指向字符或字符数组的指针。您可以按如下方式构造它: #include <stdio.h> #include <stdlib.h> char command[256]; /* Big enough for "stat " + longest file name. */ char *myFile

我试图让我的C程序在Unix中使用系统运行命令

我可以制作一些类似systemstat myFile的东西,其中myFile是我程序中的一个变量吗? 还有其他可能的方法吗?

系统采用指向字符或字符数组的指针。您可以按如下方式构造它:

#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是一个loooong名称,那么像256这样的硬限制并不是防弹编码,因为可能会出现缓冲区溢出。Supercalifragilisticexpialidocious文件名并非闻所未闻:-如果你想像专业人士那样做,下一步将是阅读snprintf手册并向你的shell索取 getconf\u POSIX\u PATH\u MAX.

简短的回答是:不要。系统存在许多您不想处理的问题:

它通过shell运行外部程序,因此您必须担心在构建字符串时正确转义任何文件名或传递的其他选项。如果不这样做,可能会产生危险的bug

系统将挂起您的程序,直到您运行的程序完成

无法读回通过系统运行的程序的输出


使用popen解决了除外壳逃逸以外的所有问题,非常方便。使用fork和execvp或posix_spawnp更为复杂,但可以解决上述所有问题和更多问题。

对于运行命令的特定情况,可以使用syscall。看见因此使用

  struct stat mys;
  memset (&mys, 0, sizeof(mys));
  if (stat(filename, &mys)) { perror(filename); exit(EXIT_FAILURE); };
  /// use mys
一般来说,您可以考虑使用或构建命令字符串,并使用或运行命令字符串。这是不可取的,如果你可以避免这种可能性,所以你需要考虑外壳逃逸等…… 你也应该阅读,也许是为了了解,等等