Семафоры, процессы и инкрементные переменные в общей памяти - PullRequest
1 голос
/ 03 января 2012

Это домашнее задание.Я должен написать программу разветвления себя 20 раз.Каждый новый процесс добавляет +1 к переменной (целому числу), которая распределяется между всеми ними.Дело в том, что я должен использовать семафоры (IPC).Этот фрагмент кода «работает», давая в итоге значение 20.

*buf = 0;
for(i=1; i<=20; ++i) 
{
    if(fork()!=0)
    {
        *buf += 1;
        exit(0);
    }
}

РЕДАКТИРОВАТЬ: На основе этот код, который я пытаюсь получить, например:
Я ребенок 1 ...
Я ребенок 2 ...
.
.
.
Я ребенок 20 ...

Это сработало один раз (сначалавремя), а затем порядок стал случайным.Но я не изменил код.Что я делаю не так?

1 Ответ

2 голосов
/ 03 января 2012

Ваша главная проблема заключается в следующем:

    if (fork()!=0)   //<-- this

fork() вернет -1 в случае ошибки, родительский pid, ИЛИ НОЛЬ для ребенка.Таким образом, вы на самом деле делаете все в родительском.Измените на (fork () == 0), и оно сделает то, что вы хотите.

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

printf("I AM THE PARENT pid = %d\n", getpid());

*buf = 0;
for(i=1; i<=20; ++i)
{
    if((pid = fork()) == -1)
    {
        perror("fork");
        exit(1);
    }

    if (pid == 0)
    {
        v(semid, 0);
        *buf += 1;
        p(semid, 0);
        printf("I am child %d with pid = %d\n", i, getpid());
        shmdt(buf);
        exit(0);
    }
}


for (i = 1; i <= 20; ++i)
{
    pid = wait(&status);
    printf("child pid = %d reaped\n", pid);
}

printf("buf: %p\n", buf);
printf("*buf: %d\n", *buf);

shmdt(buf);

return 0;
...