【发布时间】:2021-08-08 22:48:37
【问题描述】:
对不起,我的英语提前了,我不是英语本地人,请放纵一下,我也是一名学生。
我正在尝试在 C 中重新创建管道函数,但是当我尝试在 dup2() 之前关闭管道 fd 时遇到问题,函数 close() 返回错误 Ïnvalid argument,我已经检查过如果我的 fd 有效并由 pipe() 创建。
但现在我不明白为什么我的子进程中close() 不接受我用作参数的 FD
在我的父进程中,我的函数 close() 返回一个未定义的错误
这是我运行程序时控制台返回给我的内容
关闭 1 2st cmd:未定义错误:0
关闭 1 1st cmd: 无效参数
pid_t pid;
t_command *cmd;
int pipe_fd[2];
if (pipe(pipe_fd) == -1)
perror_exit("pipe");
cmd = list->first;
if ((pid = fork()) == -1)
perror_exit("fork");
if (pid == 0)
{
/* Code fils */
cmd = cmd->next;
if (!close(pipe_fd[1]))
perror_exit("close 1 1st cmd");
if (!dup2(pipe_fd[0], STDIN_FILENO))
perror_exit("dup2 1st cmd");
if (!close(pipe_fd[0]))
perror_exit("close 2 1st cmd");
if (!execve(cmd->path_exec, cmd->tab_cmd, envp))
perror_exit("execve 1st cmd");
exit(EXIT_SUCCESS);
}
/* Code parent */
//waitpid(pid, NULL, 0);
if (!close(pipe_fd[0]))
perror_exit("close 1 2st cmd");
if (!dup2(pipe_fd[1], STDOUT_FILENO))
perror_exit("dup2 2st cmd");
if (!close(pipe_fd[1]))
perror_exit("close 2 2st cmd");
if (!execve(cmd->path_exec, cmd->tab_cmd, envp))
perror_exit("execve 2st cmd");
【问题讨论】:
-
close manual 告诉您它返回的内容:“成功返回零。出错时返回-1”。您没有检查正确的错误条件。
-
用
if (!close(pipe_fd[0]),我会测试是否关闭返回-1对吗? -
没有。这不是 C 的工作方式。
0被评估为假,其他一切都为真(包括-1)。 -
将
if (!close(...))拆分为ret = close(...); If (!ret) printf("ret=%d, err=%s\n", ret, strerror(errno))可能会有所帮助。 -
感谢您的反馈@U.Windl 确实它允许在出现错误时获得更多信息,我将保留此错误处理。
标签: c linux pipe invalid-argument