【问题标题】:C: execlp() and >C: execlp() 和 >
【发布时间】:2016-09-22 10:56:47
【问题描述】:

我想从 C 文件运行 execlp() 并将结果写入某个输出文件。 我用这条线:

buff = "./cgi-bin/smth";
execlp(buff, buff, "> /cgi-bin/tmp", NULL);

其中 smth 是编译后的 c 脚本。 但是 smth 打印到标准输出,并且没有文件出现。 会发生什么,以及如何将脚本结果放入输出文件?

【问题讨论】:

  • “会发生什么?” - 你运行程序./cgi-bin/smth,第零个参数是./cgi-bin/smth,第一个参数是> /cgi-bin/tmp。正是你要求发生的事情发生。
  • shell 为你做 I/O 重定向;如果您正在编写“外壳”,则必须自己完成。最简单的解决方法是使用system("./cgi-bin/smth > /cgi-bin/tmp");(你确定文件不应该是./cgi-bin/tmp吗?)。否则,您必须在程序中打开该文件并安排标准输出到该文件 - 使用 dup2()close()open(),而不是按此顺序。
  • 在处理不受信任的数据时,直接调用 exec*-family 系统调用比通过 system() 更安全的原因是不支持 shell 样式的重定向、扩展和其他特定于 shell 的魔法。如果它的行为与您在此处描述的不同,那么在 UNIX 上编写安全软件几乎是不可能的。

标签: c bash


【解决方案1】:

如果使用execlp,则必须使用dup2 自己处理。你可以看看我是如何使用execvp 处理文件的。我传递了一个用于重定向的标志,然后我处理它:

  if (structpipeline->option[0] == 1) { /* output redirection */    
        int length = structpipeline[i].size;
        char *filename = structpipeline->data[length - 1];
        for (int k = length - 2; k < length; k++)
            structpipeline->data[k] = '\0';    
        fd[1] = open(filename, O_WRONLY | O_CREAT, 0666);
        dup2(fd[1], STDOUT_FILENO);
        close(fd[1]);
    } /* TODO: input redirection */
    execvp(structpipeline[i].data[0], structpipeline[i].data);

另请参阅此问题 Redirecting exec output to a buffer or file

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    相关资源
    最近更新 更多