阅读命名管道问题

时间:2015-12-24 23:25:41

标签: c linux macos pipe

我有这段代码C:

#define BUFSIZE 256

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


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

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

    if( (fdOut = open(argv[2], O_WRONLY ) )<0)
    {
        perror("Errr pipe output");
        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);
        }
        printf("%s\n",var1);
        if( readLine(fdIn, var2, sizeof(var2)) == 0)
        {
            printf("exit2\n");
            exit(0);
        }

        removeNewLine(var1);
        removeNewLine(var2);

        if( atoi(var2) != 0){
            if( atoi(var1) == 0  || (atoi(var1) % atoi(var2)) == 0 )
                sprintf(string,"ok\n");
            else
                sprintf(string,"no\n");

        }

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

}

代码中使用的函数:

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\n");
                    exit(1);
                }
                byteLetti+=n;


            }
            while (n > 0 && *(str+index++) != delimiter && index < bufferSize);


            return byteLetti; /* Return false if end-of-input */
        }
void removeNewLine( char *s )
    {
        removeDel(s, "\r\n");
    }
void removeDel( char *s, char *del)
    {
        s[strcspn ( s, del )] = '\0';
    }

我有两个管道用于输入,另一个用于输出。我在输入管道上写入,使用echo "4\n2\n" > i(通过终端)字符串"4\n2\n"和两个readline(如果在while循环中为2)我应该读取“4”然后通过第二个readline“ 2" 。这是因为Readline函数按'\ n'分割;但是当第一个结束时,如果在while循环中打印var1(应该只包含"4"),但它打印4\n2\n,我不明白为什么。 我错了什么?

1 个答案:

答案 0 :(得分:1)

\n实际上不是换行符。这是一个转义序列, 在某些情况下 被解释,并导致解释器替换换行符。 C编译器在字符串和字符文字中进行这种解释和替换,因此编译的程序实际上包含换行符。

shell及其echo内置命令不一定执行此解释。默认情况下,OS X附带的bash不会解释此类转义序列。您可以通过传递-e选项来实现。请注意,/bin/echo或其他shell的内置echo命令可能不支持该选项。

因此,您可以在程序中提供输入字符流4,换行符,2,换行符,换行符。您实际提供的内容包括4\n2\n,换行符。