2011-03-05 41 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