У меня есть этот код 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?
perror("argument error");
весьма бесполезна для пользователя программы. Предложите что-нибудь похожее на:fprintf( stderr, "Usage %s <input file> <output file>\n", argv[0] );
- person user3629249   schedule 06.01.2016if( (fdOut = open(argv[2], O_WRONLY ) )<0) { perror("pipe input error open"); exit(1); }
, текст в вызовеperror()
неверен (вероятно, ошибка копирования и вставки) - person user3629249   schedule 06.01.2016