Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C UNIX在另一个程序中运行程序_C_Unix - Fatal编程技术网

C UNIX在另一个程序中运行程序

C UNIX在另一个程序中运行程序,c,unix,C,Unix,我试图从C程序(UNIX内部)中执行一个程序 我得到了一个名为exec的可执行文件(程序在执行过程中需要一个字符串输入,并将该输入写入另一个名为sample的文件),我想在program.c中执行它,但通过间接方式提供字符串输入 为此,我创建了一个文件,如下所示: % vim input 我在输入文件中写了以下内容 content 现在在program.c中 #include<unistd.h> int main() { const char* command = "

我试图从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;
}
然后它工作了,输入的数据保存在示例文件中

有人能告诉我在间接语法中做错了什么吗


谢谢。

你不能用
execvp
进行那样的重定向。使用
system()
或开始与
dup()和朋友友好相处。你可以在谷歌上搜索“实现重定向”。。您可能会看到很多关于shell(例如)如何处理此问题的示例。

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

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

要以这种方式执行重定向,必须先使用
dup2(2)
系统调用,然后再调用
execvp

int fd = open("input", O_RDONLY);
/* redirect standard input to the opened file */
dup2(fd, 0);
execvp("/path/to/exec", ...);
当然,在实际程序中还需要一些额外的错误检查。

函数族对输入重定向或解析命令行一无所知:它会尝试完全执行您提供的可执行文件。它试图搜索名为“
”/exec
”的可执行文件,但该文件并不存在,这并不奇怪

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

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

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