我正在尝试运行具有特定标准输入的程序.我成功使用了一个文件的文件描述符,其中有我想要放入stdin的内容,但是我无法直接在stdin上编写:
$cat input.test
echo Hello
$
Run Code Online (Sandbox Code Playgroud)
代码C:
int main(int argc, char **argv)
{
int fd = 0;
fd = open("input.test", O_CREAT);
close(STDIN_FILENO);
dup2(fd, STDIN_FILENO);
char *const args[] = { "bash", NULL };
execvp("bash", args);
}
Run Code Online (Sandbox Code Playgroud)
这样可行 :
$./a.out
Hello
$
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用管道直接在STDIN上编写,程序将不显示任何内容并继续运行:
int main(int argc, char **argv)
{
int fds[2];
pipe(fds);
close(STDIN_FILENO);
dup2(fds[1], STDIN_FILENO);
write(fds[1], "echo Hello;", 11); // Résults are identics with fds[0]
char *const args[] = { "bash", NULL };
execvp("bash", args);
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
亲切地,巴斯蒂安.
编辑问题解决了:
感谢您的回答,这里的代码有效:
int main(void)
{
int fd[2];
pid_t pid;
if (pipe(fd) < 0)
return EXIT_FAILURE;
if ((pid = fork()) < 0)
return EXIT_FAILURE;
else if (pid != 0) { /* father */
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
execlp("bash", "bash", (char *)0);
} else { /* son */
close(fd[0]);
write(fd[1], "echo hello\n", 11);
}
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
您需要将管道的读取端复制到stdin,而不是写入端。(显然,写到写端。)
#include <unistd.h>
#include <string.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int fds[2];
char cmd[] = "echo hello\nexit\n";
pipe(fds);
close(STDIN_FILENO);
dup2(fds[0], STDIN_FILENO);
write(fds[1], cmd, strlen(cmd));
char *const args[] = { "bash", NULL };
execvp("bash", args);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不过,请确保检查所有这些函数的返回值,否则,将永远无法调试代码。