решение Петерсона для критической проблемы сечения - PullRequest
2 голосов
/ 13 августа 2010
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
int turn;
int flag[2];
int main(void)
{
        int pid,parent=1;
        printf("before vfork\n");
        if((pid=vfork())<0)
        {
                perror("vfork error\n");
                return 1;

        }
        while(1)
        {
                if(pid==0)
                {
                     while(parent==1)
                     {
                      sleep(2);
                     }
                     parent=0;
                     flag[0]=1;
                     turn=1;
                     while(flag[1]&&turn==1);
                     printf("This is critical section:parent process\n");
                     flag[0]=0;
                }
                else
                {
                        parent=2;
                        printf("This is parent");
                        flag[1]=1;
                        turn=0;
                        while(flag[0]&&turn==0);
                        printf("This is critical section:child process %d \n",pid);
                        flag[1]=0;
                }
        }

}

Это мой код. Может кто-нибудь сказать, почему контроль не приходит к моему родительскому процессу.

Ответы [ 5 ]

3 голосов
/ 13 августа 2010

man 2 vfork говорит:

   (From  POSIX.1)  The  vfork()  function has the same effect as fork(2),
   except that the behavior is undefined if the process created by vfork()
   either  modifies  any  data other than a variable of type pid_t used to
   store the return value from vfork(), or returns from  the  function  in
   which  vfork()  was called, or calls any other function before success-
   fully calling _exit(2) or one of the exec(3) family of functions.

Поскольку вы изменяете данные в дочернем процессе, поведение vfork() не определено, поэтому все, что он делает, является правильным (здесь под «правильным» я подразумеваю »понимаетсяспецификация ").

1 голос
/ 13 августа 2010

Вот важный бит со страницы руководства Linux.Ключевые слова: " родительский элемент приостановлен до тех пор, пока дочерний элемент ..."

    vfork()  differs from fork(2) in that the parent is suspended until the
    child makes a call to execve(2) or _exit(2).  The child shares all mem-
    ory  with its parent, including the stack, until execve(2) is issued by
    the child.  The child must not return from the current function or call
    exit(3), but may call _exit(2).

Ваш родительский процесс не был приостановлен.Попробуйте использовать clone.

1 голос
/ 13 августа 2010

vfork () был разработан для быстрого создания процессов с помощью execve (): vfork () + немедленный execve ().А в случаях, когда потомки изменяют какие-либо данные родительского процесса, поведение не определено.Проверьте информацию о человеке.

В моем случае такое поведение было таким, что родительский контроль достигал контроля только после закрытия детей.

1 голос
/ 13 августа 2010

Поскольку все виртуальное адресное пространство родительского объекта реплицируется в дочернем. Таким образом, два процесса имеют отдельные адресные пространства. И флаг [1] никогда не становится 1 в родительском процессе.

0 голосов
/ 13 августа 2010

Этот код не гарантирует честность;это только предотвращает взаимоблокировку.

Ничто не мешает дочернему процессу выполняться снова и снова.

Если вы хотите, чтобы блокировка была справедливой, вам придется сделать это так.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...