C close() : неверный аргумент

avatar
Med_Wo
8 августа 2021 в 22:48
155
1
0

Извините заранее за мой английский, я не являюсь носителем английского языка и будьте снисходительны, я тоже студент.

Я пытаюсь воссоздать функцию канала в C, но у меня возникла проблема, когда я пытаюсь закрыть канал fd до dup2(), функция close() возвращает мне ошибку Ïnvalid argument, я уже проверил если мой fd действителен и создан pipe().

Но теперь я не понимаю, почему мой FD, используемый в качестве аргумента, не принимается close() в процессе моего сына

После этого в моем родительском процессе моя функция close() возвращает мне неопределенную ошибку

вот что мне возвращает консоль, когда я запускаю свою программу

закрыть 1 2-й cmd: неопределенная ошибка: 0

закрыть 1 1-ю команду: неверный аргумент

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");
Источник
kaylum
8 августа 2021 в 22:52
1

близкое руководство говорит вам, что оно возвращает: "возвращает ноль в случае успеха. При ошибке возвращается -1". Вы не проверяете правильное условие ошибки.

Med_Wo
8 августа 2021 в 23:03
0

С if (!close(pipe_fd[0]) я проверю, вернет ли close -1 правильно?

kaylum
8 августа 2021 в 23:05
0

Нет. C работает иначе. 0 оценивается как ложное, а все остальное верно (включая -1).

U. Windl
9 августа 2021 в 08:39
0

Может быть полезно разбить ваш if (!close(...)) на ret = close(...); If (!ret) printf("ret=%d, err=%s\n", ret, strerror(errno)).

Med_Wo
9 августа 2021 в 14:04
0

Спасибо за ваш отзыв @U.Windl, действительно, это позволяет получить больше информации в случае ошибки, я сохраню эту обработку ошибок.

Ответы (1)

avatar
kaylum
8 августа 2021 в 22:55
1

Из закрытого руководства

Возвращаемое значение

close() возвращает ноль в случае успеха. При ошибке возвращается -1, и errno устанавливается соответствующим образом.

Это означает, что вы проверяете неправильное состояние ошибки. Должно быть:

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

То же самое для других вызовов close, dup2 и execve.