带有execve的子进程无限循环
child process infinite loop with execve
这是我的管道到管道函数:
int *pip
是我要读取的管道
char **cmd
是我要执行的命令
char **envp
指向环境变量
我想将管道 (pip) 作为带有 dup2 的 STDIN
并使用 dup2
将新管道 (fd) 作为 STDOUT
问题是当执行到execve的时候命令执行了但是程序卡在了死循环
int *pipe_to_pipe(int *pip, char **cmd, char **envp) {
int *fd;
int pid;
fd = (int *)malloc(sizeof(int) * 2);
if (!fd || pipe(fd) == -1)
error(1);
pid = fork();
if (pid == -1)
error(1);
if (pid == 0)
{
dup2(pip[0], STDIN_FILENO);
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(pip[1]);
execve((command_path), cmd, envp);
exit(0);
}
wait(NULL);
free(pip);
return (fd);
}
例如,如果我的 int *pip 中有“hello world”
作为 char **cmd,我有 cmd[0] = "cat",cmd[1] = "-e"。
当我做 execve(path, cmd, envp);
程序猫“你好世界”和无限循环在这里。
我该如何解决这个问题?
问题出在我没有关闭父进程中的管道“pip”添加那些将由父进程执行的行修复一切
if (pid != 0){
close(pip[0]);
close(pip[1]);
wait(NULL);
}
否则它解决了我的问题我不明白为什么如果有人能向我解释我将不胜感激
感谢所有回答我的人 <3
这是我的管道到管道函数:
int *pip
是我要读取的管道char **cmd
是我要执行的命令char **envp
指向环境变量
我想将管道 (pip) 作为带有 dup2 的 STDIN 并使用 dup2
将新管道 (fd) 作为 STDOUT问题是当执行到execve的时候命令执行了但是程序卡在了死循环
int *pipe_to_pipe(int *pip, char **cmd, char **envp) {
int *fd;
int pid;
fd = (int *)malloc(sizeof(int) * 2);
if (!fd || pipe(fd) == -1)
error(1);
pid = fork();
if (pid == -1)
error(1);
if (pid == 0)
{
dup2(pip[0], STDIN_FILENO);
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(pip[1]);
execve((command_path), cmd, envp);
exit(0);
}
wait(NULL);
free(pip);
return (fd);
}
例如,如果我的 int *pip 中有“hello world”
作为 char **cmd,我有 cmd[0] = "cat",cmd[1] = "-e"。
当我做 execve(path, cmd, envp);
程序猫“你好世界”和无限循环在这里。
我该如何解决这个问题?
问题出在我没有关闭父进程中的管道“pip”添加那些将由父进程执行的行修复一切
if (pid != 0){
close(pip[0]);
close(pip[1]);
wait(NULL);
}
否则它解决了我的问题我不明白为什么如果有人能向我解释我将不胜感激 感谢所有回答我的人 <3