Попытка узнать, как реализовать Семафоры в C в управляемом цикле - PullRequest
2 голосов
/ 15 апреля 2019

Я пытаюсь понять, как использовать семафор.Я писал код, в котором один процесс выполняет несколько дочерних процессов в управляемом цикле.Я хочу реализовать дочерние элементы для доступа к ресурсам с помощью семафорных замков.Всякий раз, когда я что-то пишу, у меня возникает проблема с ошибкой сегментации (сбрасывается ядро).Всякий раз, когда я ищу какую-то помощь, я нахожу реализацию без хорошего объяснения.Вот что я написал на данный момент

в основной программе:

#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: я не новичок в программировании, но я новичок в системном программировании.

1 Ответ

0 голосов
/ 15 апреля 2019

Я думаю, что вы путаете с семафором System V , потому что вы пытаетесь настроить семафор Posix (http://man7.org/linux/man-pages/man3/sem_open.3.html) с режимами, определенными для System V единицы (http://man7.org/linux/man-pages/man2/semget.2.html). Чем быть осторожным при использовании указателей ... после сопоставления разделяемой памяти с вашей переменной scount вы выполняете scount = 0. Я полагаю, вы хотели бы инициализировать его равным 0, выполнив * scount = 0.

Дайте мне знать, если и как вы решили:)

...