Я пытаюсь понять, как использовать семафор.Я писал код, в котором один процесс выполняет несколько дочерних процессов в управляемом цикле.Я хочу реализовать дочерние элементы для доступа к ресурсам с помощью семафорных замков.Всякий раз, когда я что-то пишу, у меня возникает проблема с ошибкой сегментации (сбрасывается ядро).Всякий раз, когда я ищу какую-то помощь, я нахожу реализацию без хорошего объяснения.Вот что я написал на данный момент
в основной программе:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<sys/wait.h>
#define key 0x10101010
int main(int * argc, char * argv[])
{
int i,count=0;
pid_t pid;
int status;
int *scount;
int shmid;
shmid = shmget(key,sizeof(int),IPC_CREAT | 0666);
if(shmid == -1)
{
perror("\n SHM Error");
}
scount = shmat(shmid,0,0);
scount = 0;
for(i = 0;i<10;i++)
{
pid = fork();
if(pid < 0){
perror("\nFork error\n");
}
else if(pid == 0){
execlp("./child","./child",NULL);
exit(0);
}
}
for(i =0;i<10;i++)
{
if(pid > 0){
wait(pid);
//printf("\nI am parent and my PID %d",getppid());
}
}
printf("\nTotal number of processes forked are %d\n",*scount);
sem_unlink("./semakey123");
return 0;
}
и в дочернем процессе:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<semaphore.h>
#define key 0x10101010
#define semkey 0x91919191
int main(int *argc, char *argv[])
{
int shmid,semid;
int *count;
sem_t *sem;
sem = sem_open("./semakey123",IPC_CREAT |0666);
sem_init(sem,0,0);
if(sem = SEM_FAILED)
perror("\n Semaphore not opened");
shmid = shmget(key,sizeof(int), IPC_CREAT | 0666);
if(shmid ==-1)
{
perror("\n SHM Error");
}
else printf("\n SHM attached to CHild");
count = shmat(shmid,0,0);
printf("\nEntering Critical section");
sem_wait(sem);
sleep(3);
*count+=1;
printf("\n Count: %d\n",*count);
sleep(2);
printf("\nExiting critical section");
sem_post(sem);
return 0;
}
Когда я комментирую код, связанный с семафором, этоКоличество в общей памяти выходит за пределы.Программа завершается без перехода в бесконечный цикл, но все равно на дампе ядра происходит.Когда код семафора не закомментирован, я сразу же получаю ошибку сегментации.Любая помощь приветствуется.
PS: я не новичок в программировании, но я новичок в системном программировании.