execlp命令不打印我想要的

时间:2014-07-08 17:25:45

标签: c unix command

这个小命令:

execlp("/bin/echo", "echo", "*", ">", "toto", 0) 

在终端中打印* > toto,但我希望它在文件toto中打印echo *的结果。

命令:system("echo * > toto") 运行良好,但我想使用excelp命令,我做错了什么?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

尖括号('>')重定向是特定于shell的。

你可以做,例如:

execlp("/bin/sh", "/bin/sh", "-c", "/bin/echo * > toto", NULL);

请注意,这会调用2个与shell相关的特定行为:

  1. *通配符:星号通配符将扩展(由shell ,非常重要)到当前目录中的所有文件;和
  2. >重定向:echo命令的标准输出将被重定向到文件(或管道)toto
  3. 如果你想在C中进行相同类型的重定向(即不需要执行shell),你必须:

    // open the file
    int fd = open("toto", "w");
    
    // reassign your file descriptor to stdout (file descriptor 1):
    dup2(fd, 1); // this will first close file descriptor, if already open
    
    // optionally close the original file descriptor (as it were duplicated in fd 1 and is not needed anymore):
    close(fd);
    
    // finally substitute the running image for another one:
    execlp("/bin/echo", "echo", "*" 0);
    

    请注意,您仍然可以获得' *'写到文件。

    编辑: execlp的第一个参数实际上是要运行的可执行文件,文件图像将替换当前正在运行的进程。在第一个参数出现后,完整的argv数组必须包含argv[0]。我已经编辑了上面的代码来反映这一点。有些程序使用此argv[0]来更改其个性(例如,busybox是一个可执行lsechocat和许多其他unix命令的可执行文件线路公用事业); bash以及从/bin/sh链接的内容肯定是这种情况。