Семафоры Posix с FIFO не работают должным образом - PullRequest
0 голосов
/ 09 ноября 2018

Я написал небольшую демонстрационную программу клиент-сервер, которая должна реализовывать простую связь между двумя процессами с использованием FIFO и двумя семафорами. Проблема заключается в том, что даже если я поставил sem_wait до того, как клиент прочитает fifo, он не будет ждать, пока сервер выполнит запись на fifo, поэтому клиент читает старое значение («2» вместо «pippo»). Я действительно не могу найти, где ошибка. Следуя коду Сервера и Клиента. Я надеюсь, что кто-то может мне помочь.

Клиент:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/stat.h>   
#include <sys/types.h>
#include <signal.h>
#include <stdarg.h>
#include <fcntl.h>
#define FIFO_FILE "MIA_FIFO"

FILE * fiforw ; 

int fifo_write ( char * buf );  
int fifo_read ( char * buf );

sem_t *pizz;
sem_t *cli;

int main(void){

fiforw=fopen ( FIFO_FILE, "rw");

pizz=sem_open("pizz",  O_EXCL, S_IRUSR | S_IWUSR, 0);
cli=sem_open("cli",  O_EXCL, S_IRUSR | S_IWUSR, 0);

char buff[20];
int pieces=10;;

sprintf(buff,"%d",pieces);

fifo_write(buff);

sem_post(cli);

sem_wait(pizz);

fifo_read(buff);

printf("I've read %s \n",buff);  //here he should read "pippo" instead of "2"


fclose ( fiforw );

}

int fifo_write ( char * buf ) {

    fputs ( buf, fiforw );

    return 1;
}

int fifo_read ( char * buf ) {

    fgets( buf, sizeof(buf)+1, fiforw);

    return 1;
}

Сервер:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/stat.h>   
#include <sys/types.h>
#include <signal.h>
#include <stdarg.h>
#include <fcntl.h>
#define FIFO_FILE "MIA_FIFO"

int fifo_write ( char * buf );  
int fifo_read ( char * buf );

sem_t *pizz;
sem_t *cli;
FILE * fiforw;

int main(void){

    mkfifo(FIFO_FILE,0666);
    fiforw = fopen ( FIFO_FILE, "rw");  

    char buff[20];
    char temp[]="pippo";
    pizz = sem_open("pizz", O_CREAT, S_IRUSR | S_IWUSR, 0);
    cli= sem_open("cli", O_CREAT, S_IRUSR | S_IWUSR, 0);

    //while(1) {

    sem_wait(cli);

    fifo_read(buff);

    printf("the value is %s \n",buff);  

    sprintf(buff,"%s",temp);    

    printf("i will write pippo on the fifo \n");

    fifo_write(buff);

    sem_post(pizz);

    fclose ( fiforw );
    //}

}


int fifo_write ( char * buf ) {
    fputs ( buf, fiforw );
    return 1;
}

int fifo_read ( char * buf ) {
    fgets( buf, sizeof(buf)+1, fiforw);
    return 1;
}

1 Ответ

0 голосов
/ 11 ноября 2018

Сначала запускается сервер, затем требуется клиент. В этом случае полезно проверить коды возврата из системных вызовов.

...