что-то о расписании процессов ОС? - PullRequest
1 голос
/ 25 марта 2012

Я пишу следующие коды и запускаю его в моем linux. Каждый раз после разветвления терминалы печатают два PID, который показывает, что оба процесса запланированы ОС, а затем наступает время для запуска «scanf», оба процесса блокируются. жду ввода. Однако каждый раз, когда я ставлю число, я получаю тот же PID, напечатанный на терминале. Означает ли это, что тот же процесс вызывается ОС, когда ввод-вывод терминала встречается, или происходит что-то еще?

int main(int argc, char* argv[])
{
    int num;

    if(fork() >= 0)
    {
       printf("%x\n",getpid());
       while(1)
       {
          if(scanf("%d",&num) != EOF)
          {
             printf("%x\n",getpid());
          }
       }
    }
    printf("\nit is over:%x\n", getpid());
}

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Как уже заметил Хантер МакМиллен в комментариях, вы группируете дела для родителя и ребенка.Теперь они оба запланированы, как отмечено различными PID с, и оба теперь ждут на scanf.Как только вы вводите данные, вы видите только один PID, потому что введенный вами ввод был частью одного процесса. Другой процесс (может быть родительским или дочерним) все еще ждет, пока вы что-то введете .Теперь, даже если ваш терминал заполнен одним PID, непрерывно выводимым одним процессом, попробуйте ввести некоторые данные еще раз и нажмите ввод.Теперь вы можете видеть, как печатается PID s!

0 голосов
/ 26 марта 2012

Это потому, что в операторе if () функция fork () создает дочерний процесс и выполняется в бесконечном цикле.Есть концепция родительского процесса, родительского процесса, созданного с помощью системного вызова fork ().Оператор после if () заканчивается, принадлежит родительскому процессу, и здесь он будет выполняться только после завершения дочернего процесса.Вот почему вы получаете тот же идентификатор процесса, что и дочерний процесс.

...