gpt4 book ai didi

c - 具有 FIFO 的 Posix 信号量无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:56 25 4
gpt4 key购买 nike

我编写了一个小型客户端-服务器演示程序,它应该使用 FIFO 和两个信号量在两个进程之间实现简单的通信。问题是,即使我在客户端读取 fifo 之前放置了一个 sem_wait,他也不会等待服务器写入 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;
}

最佳答案

首先运行服务器,然后才需要客户端。如果是这种情况,检查系统调用的返回码会很有帮助。

关于c - 具有 FIFO 的 Posix 信号量无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53229875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com