我有这个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上的更多输入?