【问题标题】:C close() : Invalid argumentC close() : 无效的参数
【发布时间】: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


【解决方案1】:

来自close manual

返回值

close() 成功时返回零。出错时,返回 -1,并正确设置 errno。

这意味着您正在检查错误的错误情况。应该是:

if (close(pipe_fd[1]) == -1)

对于其他 closedup2execve 调用也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    相关资源
    最近更新 更多