Запись в трубу всегда терпит неудачу - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь установить связь между двумя процессами, пытаясь прочитать данные из текстового файла в первый канал и прочитать его на другом канале, но функция записи всегда дает сбой:

Main:

int main(int argc, char* argv[])
{
    int readerPip[2], writerPip[2], reader, writer;

    if (pipe(readerPip))
    {
      fprintf (stderr, "Pipe failed.\n");
      return EXIT_FAILURE;
    }

    if(pipe(writerPip))
    {
      fprintf (stderr, "Pipe failed.\n");
      return EXIT_FAILURE;
    }

    close(readerPip[1]); // closing reader writing side pipe for main thread
    reader = fork();
    if (reader < 0)
    {
        perror("Cannot fork()");
        exit(EXIT_FAILURE);
    }
    else if (reader == 0)
    {
        do_reader(readerPip);
    }

    wait(NULL);
    close(writerPip[0]); // closing writer reader side pipe for main thread
    do_father(readerPip, writerPip);
    close(readerPip[0]); // closing reader reader side pipe for main thread
    close(writerPip[1]); // closing writer writing side pipe for main thread
    writer = fork();

    if (writer < 0)
    {
        perror("Cannot fork()");
        exit(EXIT_FAILURE);
    }
    else if (writer == 0)
    {
        do_writer(writerPip);
    }

    return 1;
}// main

do_Reader:

void do_reader(int readerPipe[])
{
    char stringCommand[17];
    long long unsigned command;

    close(readerPipe[0]);
    while (1)
    {
        scanf("%s", stringCommand);
        command = convertStringToPolygon(stringCommand);

        if ((command & 0xFFFFFFFF) == 0xFFFFFFFF)
        {
            break;
        }

        if (write(readerPipe[1], stringCommand, strlen(stringCommand) ) == -1)
        {
            printf("writing falied");
        }
        else
        {
            printf("success");
        }

        printf("\n");
    }

    close(readerPipe[1]);
    exit(0);
}

do_father

void do_father(int readerPipe[], int writerPipe[])
{
    long long unsigned nbytes;
    char currentPolygon[17];
    currentPolygon[16] = '\0';
    while (1)
    {
        nbytes = read(readerPipe[0], currentPolygon, sizeof(currentPolygon));
        if (nbytes == 0)
        {
            printf("done");
            break;
        }

        manageProgram(readerPipe, writerPipe,        convertStringToCommand(currentPolygon));
    }
}

do_writer

void do_writer(int pip[])
{
    close(pip[1]);
    long long unsigned command, nbytes;

    while (1)
    {
    nbytes = read(pip[0], &command, sizeof(command));
        if (nbytes == 0)
        {
            break;
        }
        if ((((command & THIRD_BIT_MASK) != FALSE) || ((command & FORTH_BIT_MASK) 
!= FALSE) ||
            ((command & FIFTH_BIT_MASK) != FALSE)) != FALSE)
            generateOutputDependsOnBits(command);
    }

    close(pip[0]);
    exit(0);
}

остальная часть кода не имеет значения, так как запись для канала чтения не работает.текстовый файл выглядит следующим образом:

3a 0000050000050505 3e 003cc40000c43c3c ba 000088ec9c32ce32 f8 cc 3a 000085ec9a32cd32 4c 8c 5c ac fd FFFFFFFFFFFFFFFF

1 Ответ

0 голосов
/ 08 декабря 2018

Вы закрываете readpipe[1] в main ( до * fork) и закрываете readpipe[0] в do_reader, поэтому обе стороны трубы закрыты вребенок.

Переместите close(readpipe[1]) на main дальше (например, до wait).

Но, возможно, вы не захотите wait там.Возможно, вы захотите сделать это после do_father, так как это будет зависеть от того, достаточно ли велики буферы конвейера ядра для хранения всех данных, которые потомок отправляет родителю, прежде чем родитель даже попытается получить первый байт.

...