Linux ошибка выполнения отправителя и получателя сообщения (ошибка повторения) - PullRequest
0 голосов
/ 05 апреля 2020

Я работал в Linux. Я только хочу напечатать сообщение на приемнике, когда Сандерс отправляет. но получатель продолжает выводить то же сообщение.

Я точно хочу получить сообщение в получателе, только если отправитель отправляет сообщение. Этот код мой код Я стараюсь, но это не легко. помощь

//Sender
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
int main()
{
  int fd; 
  char message[100];
  printf("Enter \"exit\"  to stop: \n");

  while(1)
  {
    fd=open("/home/control/work/io_dev",O_RDWR); //open file
    if (fd ==-1) {
        printf("Device open error"); 
        exit(1);
    }
    sleep(1);
    write(fd,message,sizeof(message));
    printf("Sender>>"); 
    fgets(message,sizeof(message),stdin);// input message
    write(fd,message, sizeof(message));//write on file
    if(strcmp(message,"exit\n")==0)
        break;
    write(fd,message,sizeof(message));

    close(fd); //file close
  }
}
//Receiver
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

int main()
{
  int fd;
  char message[100];

  while(1){
    sleep(1);
    fd=open("/home/control/work/io_dev",O_RDWR|O_CREAT); // open or create file
    if (fd == -1) { //when file open error occurs
      printf("Device open error");
      exit(1);
    }
    read(fd, message, sizeof(message));//read file
    sleep(1);//wait
    if(strcmp(message,"exit\n") ==0)//loop off
        break;
    if(message[0]!='\0'){
    printf("Received>> %s",message);//print
    }
    write(fd,message,sizeof(message));
    close(fd);//file close
    sleep(3);
  }
}

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

следующий предложенный код для receiver

  1. безупречной компиляции
  2. выполняет желаемую функциональность
  3. правильно проверяет ошибки
  4. избегает необходимость постоянно открывать / закрывать устройство ввода-вывода
  5. отражает то, что было фактически получено, а не весь буфер приемника, большая часть которого может содержать tra sh
  6. , избегая использования '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, чтобы отдельные программы не могли наступать друг на друга.

0 голосов
/ 05 апреля 2020

Удалить первое «write (fd, message, sizeof (message))»; на стороне отправителя.

Удалить "if (message [0]! = '\ 0')" на стороне получателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...