C UNIX在另一个程序中运行程序
我试图从C程序(UNIX内部)中执行一个程序 我得到了一个名为exec的可执行文件(程序在执行过程中需要一个字符串输入,并将该输入写入另一个名为sample的文件),我想在program.c中执行它,但通过间接方式提供字符串输入 为此,我创建了一个文件,如下所示: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 = "
% 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", ...);