我正在编写一些简单的代码,以了解信号量和POSIX共享内存。但是我遇到了一些问题。
我的想法是,一个程序(服务器)打开共享内存并向其写入一个结构体(其中包含一个信号量和一个数组)。然后它等待输入,并在输入后增加该信号量。
同时,客户端打开共享内存,在信号量上等待,在服务器增加信号量后读取结构。
看起来服务器工作正常,但是我在客户端的sem_wait函数处遇到了分段错误,甚至在服务器增加信号量之前就发生了。我想不出什么错了。
服务器代码:
我的想法是,一个程序(服务器)打开共享内存并向其写入一个结构体(其中包含一个信号量和一个数组)。然后它等待输入,并在输入后增加该信号量。
同时,客户端打开共享内存,在信号量上等待,在服务器增加信号量后读取结构。
看起来服务器工作正常,但是我在客户端的sem_wait函数处遇到了分段错误,甚至在服务器增加信号量之前就发生了。我想不出什么错了。
服务器代码:
#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <semaphore.h>
#include <stdbool.h>
#define ARRAY_MAX 1024
typedef struct {
sem_t inDataReady;
float array[ARRAY_MAX];
unsigned arrayLen;
} OsInputData;
int main() {
int shm_fd;
OsInputData *shm_ptr;
if((shm_fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0666)) == -1) {
printf("shm_open failure\n");
return 1;
}
if(ftruncate(shm_fd, sizeof(OsInputData)) == -1) {
printf("ftruncate failure\n");
return 1;
}
if((shm_ptr = (OsInputData*)mmap(0, sizeof(OsInputData), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0)) == MAP_FAILED) {
printf("mmap failure\n");
return 1;
}
sem_init(&(shm_ptr->inDataReady), true, 0);
shm_ptr->array[0] = 3.0;
shm_ptr->array[1] = 1.0;
shm_ptr->array[2] = 2.0;
shm_ptr->array[3] = 5.0;
shm_ptr->array[4] = 4.0;
shm_ptr->arrayLen = 5;
getchar();
sem_post(&(shm_ptr->inDataReady));
sem_destroy(&(shm_ptr->inDataReady));
munmap(shm_ptr, sizeof(OsInputData));
close(shm_fd);
return 0;
}
客户端代码:
#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <semaphore.h>
#include <stdbool.h>
#define ARRAY_MAX 1024
typedef struct {
sem_t inDataReady;
float array[ARRAY_MAX];
unsigned arrayLen;
} OsInputData;
int main() {
int shm_fd;
OsInputData *shm_ptr;
if((shm_fd = shm_open("/my_shm", O_RDONLY, 0666)) == -1) {
printf("shm_open failure\n");
return 1;
}
if((shm_ptr = (OsInputData*)mmap(0, sizeof(OsInputData), PROT_READ, MAP_SHARED, shm_fd, 0)) == MAP_FAILED) {
printf("mmap failure\n");
return 1;
}
sem_wait(&(shm_ptr->inDataReady));
printf("%u\n", shm_ptr->arrayLen);
munmap(shm_ptr, sizeof(OsInputData));
close(shm_fd);
return 0;
}
sem_destroy
行对解决问题没有任何帮助。我还在sem_init
、sem_post
和sem_wait
函数中添加了错误检查,但它们没有返回错误。 - Luka Aleksić