我正在使用命名信号量和共享内存,任何人都可以告诉我为什么这段代码会出现分段错误?这是一段代码,它试图实现编写器代码使用命名信号量和共享内存的读取器和写入器问题 我需要知道为什么这段代码会出现分段错误?
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <semaphore.h>
#include <stdio.h>
#define MAX 20
int main (int argc, char** argv)
{
int fd;
sem_t *db;
int writtenData=0;
int *addr=NULL;
pid_t pid = getpid();
printf("hin");
fd = shm_open("/mymem",O_CREAT|O_RDWR, S_IRUSR | S_IWUSR); //segmentation fault here
printf("byn");
ftruncate(fd,sizeof(int));
if(fd==-1)
printf("injan");
db = sem_open("db",O_CREAT,0,1);
addr = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
*(addr)= 0;
//write db toshared memory
//*
//*
while (writtenData<=MAX)
{
sem_wait(db);
printf("The Writter acquires the clockn");
writtenData= *(addr);
printf("The writer %d writes the value %dn",pid,writtenData);
writtenData++;
*(addr)= writtenData;
printf("The Writter release the Lock n");
sem_post(db);
}
}
您的程序仅在第二次(和后续(调用时崩溃,并且不会在您认为崩溃的地方崩溃。
这:
db = sem_open("db",O_CREAT,0,1);
创建权限为 000 的命名信号量(即任何人都无法访问(。如果该信号量不存在(首次运行(,则此调用成功。如果它确实存在(第二次和后续运行(,则此调用失败并显示 Permission denied
,并且您尝试在此处使用结果:
sem_wait(db);
崩溃并出现分段错误。
课:
- 学习使用调试器来了解(而不是错误地猜测(代码崩溃的位置。
- 始终检查系统功能是否有错误。
- 仔细阅读
man
页面,并确保您提供的论点有意义。