gpt4 book ai didi

c - 将信号量与 POSIX 共享内存一起使用时出现段错误

转载 作者:行者123 更新时间:2023-12-02 01:04:59 26 4
gpt4 key购买 nike

我正在编写一些简单的代码来教自己关于信号量和 POSIX 共享内存的问题。

这个想法是一个程序,即服务器,打开共享内存并向其中写入一个结构(包含一个信号量和一个数组)。然后它等待输入并在输入后增加信号量。

同时客户端打开共享内存,等待信号量,由服务器递增后,读取结构。

服务器似乎工作正常,但是我在 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_post 并不意味着您的系统已经切换到等待它的进程。当你摧毁它时,另一个人可能仍在使用它。

在这种情况下,SIGSEGV 是一种善意。很少有程序员检查 sem_wait 的返回值,这会导致程序认为它们是同步的,而实际上它们不同步。

关于c - 将信号量与 POSIX 共享内存一起使用时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48217694/

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