следующий предложенный код для receiver
- безупречной компиляции
- выполняет желаемую функциональность
- правильно проверяет ошибки
- избегает необходимость постоянно открывать / закрывать устройство ввода-вывода
- отражает то, что было фактически получено, а не весь буфер приемника, большая часть которого может содержать tra sh
- , избегая использования 'magi c 'чисел в коде
и теперь предлагаемый код:
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#define MAX_MSG_LEN 100
int main( void )
{
int fd;
char message[ MAX_MSG_LEN ];
fd=open("/home/control/work/io_dev",O_RDWR|O_CREAT, 0666 ); // open or create file
if (fd == -1)
{ //when file open error occurs
printf("Device open error");
exit(1);
}
while(1)
{
ssize_t bytesRead = read(fd, message, sizeof(message));//read file
if( bytesRead <0 )
{
// handle error and exit
perror( "read failed" );
close( fd );
break;
}
if( bytesRead == 0 )
{ // sender closed the connection
// clean up and exit
close( fd );
break;
}
message[ bytesRead ] = '\0';
if(strcmp(message,"exit\n") ==0)//loop off
break;
printf("Received>> %s",message);//print
if( write(fd,message,strlen(message)) != strlen( message ) )
{
// handle incomplete message write
}
}
close(fd);//file close
}
ОДНАКО, если вы пытаетесь «ускорить» операции чтения / записи с несколькими считывателями и писатели; затем настоятельно рекомендуем использовать мьютекс, чтобы избежать любых «расовых» условий и, возможно, даже mkfifo()
для создания файла. Не забудьте (перед выходом из программы) уничтожить fifo.
Если вы решите использовать FIFO, обязательно вызовите unlink( filename );
, чтобы файл был уничтожен при выходе из программы
Если вы хотите сохранить повторное открытие / закрытие во время () l oop, затем используйте O_EXCL вместо O_CREAT, чтобы отдельные программы не могли наступать друг на друга.