【问题标题】:Pass a string as standard input to an executable将字符串作为标准输入传递给可执行文件
【发布时间】:2014-10-08 21:24:21
【问题描述】:

我有 count = read(pipe, buffer, buffsize); 并尝试运行通过另一个可执行文件接收到的内容(缓冲区)以对其进行不同的处理。

printf("%s", buffer); 可以正确打印出来,但是通过execl("/path", "/path", buffer, NULL); 或我尝试过的许多其他方式运行它似乎并没有运行可执行文件。 path 是编译后的可执行文件。

如果我使用execv("./path", STDIN_FILENO);,可执行文件确实可以正常运行,但这不是从管道中取出的。 path 期望字符串作为标准输入。

程序的情况是我正在使用while循环和read()在一个程序上输入输入,使用管道将该文本发送到正在运行execl的程序(没有其他需要在这个程序中完成),然后尝试使用字符串作为stdin 调用可执行文件。当用户按下回车键时,只有预期的输入通过管道以块的形式进入。

通过管道的字符串示例是this is an example。可执行文件需要将此作为标准输入输入。

如何正确获取用作/path 可执行文件的标准输入的字符串?

【问题讨论】:

  • 这里纠结了几个不同的问题;我们需要更多信息。第二个可执行文件是否期望其在其标准输入上输入,或作为命令行参数?它根本不运行,还是只是没有按预期处理输入?你是在子进程还是原始进程中做execl?该管道上是否还有其他内容,或者它完全是第二个可执行文件的预期输入?做这一切的程序是否还有其他需要做的事情?
  • @Zack 谢谢,我不确定我需要包括什么。我添加了更多信息
  • 当通过管道的字符串是“this is an example”时,count的值是多少?
  • @chux 值为1
  • 像这样运行两个程序:pgm1 | pgm2 然后让 pgm1 从标准输入读取并输出到标准输出。让 pgm2 从标准输入读取并输出到标准输出。然后连接是自动的,您所要做的就是在使用命令行启动两个程序后键入输入,如上所示。

标签: c exec stdin pipe


【解决方案1】:

听起来popen() 是您正在寻找的东西,它可以打开通往所需可执行文件的管道,以便您可以将内容传递到其标准输入,或从其标准输出中读取内容。

例如:

#define _POSIX_C_SOURCE 200809L

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE * p = popen("/bin/cat", "w");
    if ( !p ) {
        perror("error opening pipe");
        return EXIT_FAILURE;
    }

    fputs("Echo me via /bin/cat\n", p);

    if ( pclose(p) == -1 ) {
        perror("error closing pipe");
        return EXIT_FAILURE;
    }

    return 0;
}

哪个输出:

paul@thoth:~/src/sandbox$ ./testpopen
Echo me via /bin/cat
paul@thoth:~/src/sandbox$ 

【讨论】:

  • 我不确定是我没有把问题说清楚还是我误解了你的答案。问题不在于通过管道将文本从输入程序传输到第二个程序,而是将文本从第二个程序传输到可执行文件
  • @ZachSaucier:您可以在第二个程序中使用popen() 来运行可执行文件并将文本传递到其标准输入。
  • 我明白了。那么可执行文件是否必须运行?此外,我不希望更改提供给我们的可执行代码(学校项目)
  • @ZachSaucier:不,它不必运行,popen() 会执行它。 popen() 本质上是打开一个 shell,运行您的可执行文件,然后将您写入的所有内容传递给文件指针,它返回到该可执行文件的标准输入(或从其标准输出读取,如果您使用 "r" 模式调用它)。当您调用pclose() 时,它会等待您的可执行文件终止,然后返回。无需更改可执行文件中的任何代码,只要它知道它只是像往常一样从其标准输入中读取数据。
  • execv() 需要一个表示命令行参数的字符串数组作为其第二个参数,如果它试图从该数组中读取,则传递一个小整数而不是将是一个灾难性错误,它肯定不会不会导致其标准输入发生任何事情。
猜你喜欢
  • 1970-01-01
  • 2013-08-28
  • 2021-09-24
  • 1970-01-01
  • 2016-04-09
  • 2017-03-19
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多