信号量和同步中的分段错误

时间:2011-03-05 16:43:14

标签: c synchronization segmentation-fault semaphore

有时此程序会因分段错误而出错。什么是分段错误?为什么会这样?我该如何解决?

我期待输出为:

I am consumer
I am producer 
I am consumer
I am producer
(etc.)

但事实并非如此。任何人都可以向我解释这个吗?

#include<stdio.h>
#include<semaphore.h>
#include<sys/stat.h>
#include<fcntl.h>

sem_t* mutex;
sem_t* null;

main()
{
 int temp;
 int pid;
 pid = fork();

 sem_unlink("/mutex");
 sem_unlink("/null");

 null = (sem_t*)sem_open("/null",O_CREAT,S_IWUSR|S_IWGRP|S_IWOTH,0);
 mutex =(sem_t*)sem_open("/mutex",O_CREAT,S_IWUSR|S_IWGRP|S_IWOTH,1);


 if (pid != 0)
 while(1)
 {
   sem_post(null);
   sem_wait(mutex);
   printf("\nIam In Producer\n");
   scanf("%d",&temp); // just  for my verification that where i am during execution
   sem_post(mutex);
   sem_wait(null);
 }

 else
 while(1)
 {
   sem_post(null);
   sem_wait(mutex);
   printf("\nIam In consumer\n");
   scanf("%d",&temp); // just for my verification that where i am during execution
   sem_post(mutex);
   sem_wait(null);
 }

}

2 个答案:

答案 0 :(得分:1)

我认为您需要在调用sem_unlink() 之前将sem_open()fork()调用移至。你可能正在取消你不想要的东西。

说明 - 您调用fork(),现在您正在运行两个进程。假设父母在孩子获得任何处理器时间之前通过sem_unlink()sem_open()调用。现在孩子开始跑,并立即取消父母的信号量链接!

答案 1 :(得分:0)

问题是您在子级和父级中都sem_open(),但第一次调用会创建具有错误权限的信号量,因此第二次sem_open()失败,因为信号量拒绝访问。您不检查调用是否成功,因此信号量将无效,这就是您尝试使用时遇到段错误的原因。尝试在创建信号量后移动fork(),或更改信号量权限。并且不要忘记检查可能失败的任何调用的结果:)