execv *并写入stdin
发布时间:2020-12-16 03:41:40 所属栏目:百科 来源:网络整理
导读:我正在尝试运行具有特定标准输入的程序.我成功使用了一个文件的文件描述符,其中有我想要放入stdin的内容,但是我无法直接在stdin上编写: $cat input.testecho Hello$ 代码C: int main(int argc,char **argv){ int fd = 0; fd = open("input.test",O_CREAT);
我正在尝试运行具有特定标准输入的程序.我成功使用了一个文件的文件描述符,其中有我想要放入stdin的内容,但是我无法直接在stdin上编写:
$cat input.test echo Hello $ 代码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); } 这样可行 : $./a.out Hello $ 但是,如果我尝试使用管道直接在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",args); } 谢谢你的帮助 亲切, 编辑问题解决了: 感谢您的回答,这里的代码有效: 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 hellon",11); } return EXIT_SUCCESS; } 解决方法
您需要将管道的读取端复制到stdin,而不是写入端. (显然,写到写方面.)
#include <unistd.h> #include <string.h> #include <stdio.h> int main(int argc,char **argv) { int fds[2]; char cmd[] = "echo hellonexitn"; pipe(fds); close(STDIN_FILENO); dup2(fds[0],cmd,strlen(cmd)); char *const args[] = { "bash",args); return 0; } 确保检查所有这些函数的返回值,但如果不这样做,您将永远无法调试代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |