Семафоры, процессы и увеличивающие переменные в разделяемой памяти

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

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

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

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


person uluroki    schedule 03.01.2012    source источник
comment
Возможно, вы ошиблись при вызове fork(). Он возвращает ненулевое значение родительскому процессу; поэтому только ваш родитель увеличивает значение.   -  person zneak    schedule 03.01.2012


Ответы (1)


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

    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;
person Duck    schedule 03.01.2012
comment
@ Джонатан Леффлер Да, плохая формулировка. Я изменю это. - person Duck; 03.01.2012