названный выпуск fifo C

У меня есть этот код C:

#define BUFSIZE 256

int main ( int argc, char *argv[])
{
    int fdIn;
    int fdOut;

    if( argc != 3)
    {
        perror("argument error");
        exit(1);
    }

    if( (fdIn = open(argv[1], O_RDONLY ) )<0)
    {
        perror("pipe input error open");
        exit(1);
    }

    if( (fdOut = open(argv[2], O_WRONLY ) )<0)
    {
        perror("pipe input error open");
        exit(1);
    }


    int c = 2;
    while(c--)
    {
        char var1[BUFSIZE];
        char var2[BUFSIZE];
        char string[100];

        memset(var1, 0, sizeof(var1));
        memset(var2, 0, sizeof(var2));
        memset(string, 0, sizeof(string));

        if( readLine(fdIn, var1, sizeof(var1)) == 0)
        {
            printf("exit1\n");
            exit(0);
        }

        if( readLine(fdIn, var2, sizeof(var2)) == 0)
        {
            printf("exit2\n");
            exit(0);
        }

        removeNewLine(var1);
        removeNewLine(var2);

        printf("%s\n",var1);
        printf("%s\n",var2);

        int n = atoi(var1);
        int m = atoi(var2);

        if (n!=0 && m % n == 0 ) {

            sprintf(string,"multiple\n");

        }
        else{
            sprintf(string,"negative\n");

        }

        printf("%s", string);
        writeLine(fdOut, string, strlen(string));
    }
    close(fdOut);
    close(fdIn);
    exit(0);
}

Эта программа принимает 2 входа: первое — это имя входного fifo, а второе — имя выходного fifo. Эта программа делает следующее: считывает во входном fifo 2 числа, затем устанавливает, является ли второе число кратным первому числу, а затем записывает в выходной fifo «множественный» или «отрицательный». Это все за 2 раза; моя проблема в том, что он выполнил второй цикл, где первый ReadLine возвращает 0 и печатает exit1. программа не должна останавливаться на readLine отложенном содержимом в FIFO?

функции используемые в программе:

int readLine( int fd, char* str, int bufferSize)
{
    return readToDel(fd, '\n', str, bufferSize);
}

int readToDel( int fd, char delimiter, char* str, int bufferSize)
{
    int n;
    int byteLetti =0;
    int index=0;



    do /* Read characters until NULL or end-of-input */
    {

        if( (n = read (fd, str+index, 1)) < 0)
        {
            perror("Errore: lettura dal file descriptor fallita");
            exit(1);
        }
        byteLetti+=n;

    }
    while (n > 0 && *(str+index++) != delimiter && index < bufferSize);     
    return byteLetti; /* Return false if end-of-input */
}

Для тестирования этой программы я делаю так: открываю первый терминал и пишу во входном fifo таким образом:

echo "4" > input 
echo "8" > input

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

./program input output

и когда программа заблокирована на writeLine(fdOut, string, strlen(string)); (потому что на выходе fifo нет считывателя), откройте другой терминал, и я делаю: cat output

и я получаю (на основе этих входных данных):

multiple
exit1

и я не понимаю, почему. не следует ли ждать, пока больше ввода на ввод fifo?


person gino gino    schedule 06.01.2016    source источник
comment
Существует EOF, потому что больше нет данных и запись в канал невозможна, потому что он нигде не открыт для записи. Посетите stackoverflow.com/a/34327108/744720.   -  person keltar    schedule 06.01.2016
comment
эта строка: perror("argument error"); весьма бесполезна для пользователя программы. Предложите что-нибудь похожее на: fprintf( stderr, "Usage %s <input file> <output file>\n", argv[0] );   -  person user3629249    schedule 06.01.2016
comment
относительно этих строк: if( (fdOut = open(argv[2], O_WRONLY ) )<0) { perror("pipe input error open"); exit(1); }, текст в вызове perror() неверен (вероятно, ошибка копирования и вставки)   -  person user3629249    schedule 06.01.2016