【问题标题】:UNIX run program within another programUNIX 在另一个程序中运行程序
【发布时间】:2011-09-22 20:55:12
【问题描述】:

我正在尝试从 C 程序(在 UNIX 内部)中执行程序。

我获得了一个名为 exec 的可执行文件(程序在执行期间需要输入字符串并将该输入写入另一个名为 sample 的文件),我想在 program.c 中执行它,但通过间接方式输入字符串。

为此,我创建了如下文件:

% vim input

我在输入文件中写了以下内容

content

现在在 program.c 中,

#include<unistd.h>
int main()
{
      const char* command = "./exec < input";
      execvp(command, NULL);
      return 0;
}

当我运行程序时,内容没有输入到示例文件中。

但是当我没有间接地运行它时,即

const char* command = "./exec";

然后它就可以工作了,输入的输入保存在示例文件中。

谁能告诉我在间接语法中做错了什么。

谢谢。

【问题讨论】:

    标签: c unix


    【解决方案1】:

    您使用的语法应该由 bash、csh、ksh 等 shell 解释。

    系统调用execvp 只需要可执行文件的路径和一些参数,不会在那里调用 shell。

    要以这种方式执行重定向,您必须在调用execvp之前使用dup2(2)系统调用:

    int fd = open("input", O_RDONLY);
    /* redirect standard input to the opened file */
    dup2(fd, 0);
    execvp("/path/to/exec", ...);
    

    当然,您需要在实际程序中进行一些额外的错误检查。

    【讨论】:

      【解决方案2】:

      你不能像 execvp 那样做重定向。使用system() 或开始与dup() 和朋友建立友好关系。您可能会在 Google 上搜索“实现重定向”。您可能会找到很多关于 shell(例如)如何处理此问题的示例。

      【讨论】:

        【解决方案3】:

        exec(3) 系列函数对输入重定向或解析命令行一无所知:它试图准确执行您提供给它的可执行文件。它正在尝试搜索名称为 "./exec &lt; input" 的可执行文件,这并不奇怪。

        一种解决方案是使用system(3) 函数而不是execsystem 调用用户的shell(例如/bin/bash),它能够解析命令行并进行适当的重定向。但是,system() 的用途不如exec,因此它可能适合也可能不适合您的需求。

        更好的解决方案是自己进行输入重定向。你需要做什么我们使用open(3)打开文件,dup2(3)将文件描述符复制到文件描述符0(标准输入),然后exec可执行文件。

        【讨论】:

          猜你喜欢
          • 2012-02-25
          • 2013-02-19
          • 2013-07-07
          • 1970-01-01
          • 2011-10-17
          • 1970-01-01
          • 2012-08-30
          • 2020-03-25
          • 1970-01-01
          相关资源
          最近更新 更多