名为fifo C的问题

时间:2016-01-06 00:10:14

标签: c fifo named

我有这个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&#34; multiple&#34;或者&#34;否定&#34;。 这一切都是2次;我的问题是当它执行第二个循环时,第一个ReadLine返回0并打印exit1。 程序不应该停在FIFO中的readLine待处理内容中吗?

程序中使用的函数:

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上的更多输入?

0 个答案:

没有答案