我想在c程序中将bash作为子进程执行。 bash本质上应该由父进程控制:父进程从stdin读取,将读取的输入存储到缓冲区中,并通过管道将缓冲区的内容写入bash。 bash的输出应该通过另一个管道传递回父进程的stdout。例如:父进程读取“ls”并通过管道将其提供给bash,并通过另一个管道接收bash的输出。我知道这个程序没有意义,因为有更好的方法代表父进程执行ls(或其他程序)。我实际上只是想了解管道是如何工作的,这是我想到的第一个程序。我无法使这个程序工作。这就是我到目前为止所做的:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main() {
int pc[2];//"parent to child"-pipe
int cp[2];//"child to parent"-pipe
int status;
char buffer[256];
char eof = EOF;
if (pipe(pc) < 0 || pipe(cp) < 0) {
printf("ERROR: Pipes could not be created\n");
return -1;
}
pid_t child_pid = fork();
if (child_pid == 0) { //child has pid 0, child enters here
close(pc[1]);//close write end of pc
close(cp[0]);//close read end of cp
//redirecting file descriptors to stdin/stdout
dup2(cp[1], STDOUT_FILENO);
dup2(pc[0], STDIN_FILENO);
execve("/bin/bash",NULL,NULL);
} else {//parent enters here
close(cp[1]);//close write end of cp
close(pc[0]);//close read end of pc
//redirecting file descriptors to stdin/stdout
dup2(cp[0], STDOUT_FILENO);
while(1) {
read(STDIN_FILENO, buffer, 3);
write(pc[1], buffer, 3);
}
waitpid(child_pid, &status, 0);
}
return 0;
}
执行时:我输入ls,按Enter键,没有任何反应,再次输入,输出。
$ ./pipe
ls
bash: line 3: s: command not found
为什么只有角色'被传递给bash?