c - 带有 FIFO 的 Posix 信号量无法正常工作
问题描述
我编写了一个小型客户端-服务器演示程序,它应该使用 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# - C#方法调用多次
- macos - 安装 PHP 7.1 for Mac 时出错(使用 Homebrew)
- sql - 如何捕获基于 Web 的应用程序发送到 Oracle 服务器的 SQL 查询?
- mysql - SQL 中的正则表达式性能
- python - 返回 UnboundLocalError 的 Zip() 函数:分配前引用的局部变量 'zip'
- pytest - 如何从 unittest TestCase 类中声明的测试方法中获取夹具值?
- python - 使用查询字符串过滤 MultiIndex
- javascript - 如何在Javascript中跟踪局部变量值?
- django - 使用 DRF 在 Django 中与生成的令牌和魔术 URL 共享
- android - 片段 newInstance