Ошибка сегментации в семафорах и синхронизации - PullRequest
0 голосов
/ 05 марта 2011

Иногда эта программа ошибается с ошибкой сегментации. Что такое ошибка сегментации? Почему это происходит? И как мне это исправить?

Я ожидаю вывод как:

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 ]

1 голос
/ 05 марта 2011

Я думаю, вам нужно перевести вызовы sem_unlink() и sem_open() на до того, как вы позвоните fork(). Вы, вероятно, не связываете вещи, которые вам не нужны.

Объяснение - вы звоните fork(), теперь у вас запущены два процесса. Допустим, родитель получает через вызовы sem_unlink() и sem_open() до того, как ребенок получит какое-либо процессорное время. Теперь ребенок начинает работать и немедленно отменяет связь семафоров родителя!

0 голосов
/ 05 марта 2011

Проблема в том, что вы sem_open() как в дочернем, так и в родительском элементах, но первый вызов создает семафор с неправильными разрешениями, поэтому второй sem_open() завершается ошибкой, поскольку доступ к семафору запрещен. Вы не проверяете, успешен ли вызов, поэтому семафор будет недействительным, поэтому при попытке его использовать вы получаете segfault. Попробуйте переместить fork() после создания семафоров или измените разрешения семафоров. И не забудьте проверить результат любого звонка, который может потерпеть неудачу:)

...