2011-03-05 43 views
0

有时这种程序错误带有分段错误。什么是分段错误?为什么会发生?我该如何解决它?信号量和同步中的分段错误

我期待的输出为:

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); 
} 

} 

+0

首先,将“null”信号量的名称更改为其他值。你也可以考虑检查sem_open调用是否成功。 – Throwback1986 2011-03-05 16:46:38

+1

您应该为'fork()'包含''。 – Doddy 2011-03-05 17:20:21

回答

1

我认为你需要你打电话之前fork()sem_unlink()sem_open()呼叫转移到。你可能会断开你不想要的东西。

解释 - 你叫fork(),现在你有两个进程在运行。比方说,在孩子获得任何处理器时间之前,父母通过调用sem_unlink()sem_open()。现在孩子开始跑步了,立即断开父母的信号!

+0

如果我在fork()之前移动sem_open如何分叉进程可以共享它 – 2011-03-06 05:12:26

0

问题是你在孩子和父母中都有sem_open(),但是第一个调用创建的信号量的权限不对,所以第二个sem_open()失败,因为访问被拒绝给信号量。你不检查调用是否成功,所以信号量将无效,这就是为什么当你尝试使用它时会出现段错误。尝试在信号量创建后移动fork(),或者更改信号量权限。不要忘记检查任何可能失败的呼叫的结果:)

+0

我需要更多解释。那里有什么错误的权限。 – 2011-03-06 05:11:23

+0

'S_IWUSR | S_IWGRP | S_IWOTH'表示它只能由用户/组/其他人写入*,所以其他进程无法打开它。将其更改为'S_IRWXU | S_IRWXG | S_IRWXO',这应该可以解决问题。 – ldx 2011-03-06 16:07:29

+0

亚感谢我得到它 – 2011-03-08 01:55:28