Зачем мне закрывать fds при чтении и записи в канал? - PullRequest
2 голосов
/ 17 апреля 2010

Однако, что если одному из моих процессов необходимо непрерывно записывать в канал, а другому - читать?

Этот пример работает только для одной записи и одной операции чтения. Мне нужно мульти читать и писать

void executarComandoURJTAG(int newSock) {
    int input[2], output[2], estado, d;
    pid_t pid;
    char buffer[256];
    char linha[1024];

    pipe(input);
    pipe(output);
    pid = fork();

    if (pid == 0) {// child

        close(0);
        close(1);
        close(2);
        dup2(input[0], 0);
        dup2(output[1], 1);
        dup2(output[1], 2);

        close(input[1]);
        close(output[0]);
        execlp("jtag", "jtag", NULL);
    }

    else { // parent
        close(input[0]);
        close(output[1]);
        do {
            read(newSock, linha, 1024);
            /* Escreve o buffer no pipe */
            write(input[1], linha, strlen(linha));
            close(input[1]);
            while ((d = read(output[0], buffer, 255))) {
                //buffer[d] = '\0';
                write(newSock, buffer, strlen(buffer));
                puts(buffer);
            }
            write(newSock, "END", 4);

        } while (strcmp(linha, "quit") != 0);
    }
}

Ответы [ 2 ]

1 голос
/ 17 апреля 2010

Ваш код выглядит немного не так. Конкретно здесь:

    do {
        read(newSock, linha, 1024);
        /* Escreve o buffer no pipe */
        write(input[1], linha, strlen(linha));
        close(input[1]);
        while ((d = read(output[0], buffer, 255))) {
            //buffer[d] = '\0';
            write(newSock, buffer, strlen(buffer));
            puts(buffer);
        }
        write(newSock, "END", 4);

    } while (strcmp(linha, "quit") != 0);

Вы закрываете input[1] после первой итерации внешнего цикла do / while, но вам нужен этот дескриптор для каждой итерации.

Также, если внутренний цикл while, вы будете продолжать читать, пока не получите EOF. Но так как программа все еще открыта, вы не получите EOF, пока программа не закончится. Поэтому вам нужно найти какой-то другой способ узнать, что программа вернула вам все ваши данные.

1 голос
/ 17 апреля 2010

В дочернем блоке вам не нужно закрывать fds 1,2, а 3. dup2 () закроет oldfd при необходимости.

В родительском блоке не следует закрывать fd канала перед чтением и записью в них!

Для нескольких каналов используйте неблокирующий ввод-вывод или выберите ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...