c fork,exec,getpid проблема

Я новичок в языке c и Linux. У меня проблема, связанная с функциями fork(), getpid() и exec(). Я написал программу c, используя вызов fork(), код моей программы выглядит следующим образом:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

void fun()
{
  printf("\n this is trial for child process");
}

int main (int argc, char const *argv[])
{
  int i,status,pid,t;

  if(pid=fork()<0)
  { 
    printf("\nfailed to create the process\n");
  }
  if(pid=fork()==0)
  {
    printf("\n the child process is created");
    fun();
    exit(1);
  }
  while(wait(&status)!=pid);
  return 0;
}

Вывод этой программы следующий:

дочерний процесс создан

это испытание для дочернего процесса

дочерний процесс создан

это испытание для дочернего процесса

Теперь мои вопросы следующие:

  1. Почему вывод программы показывает одно и то же дважды? Вывод должен быть "дочерний процесс создан, это пробная версия для дочернего процесса"
  2. Почему вывод не соответствует коду?
  3. Можем ли мы иметь программу, которая имеет 4 процесса, и все процессы выполняют разные задачи, например, один процесс печатает «мое имя». Один процесс печатает «мой возраст», другой процесс печатает «мой адрес?
  4. Как сделать несколько процессов в основной функции?
  5. Как контролировать выполнение нескольких процессов?
  6. что делает функция exec()? Кто-нибудь может объяснить мне работу exec(), fork(), getpid() с исходным кодом?

Пожалуйста, помогите этому новичку.


person Golu    schedule 01.06.2011    source источник


Ответы (3)


В этом коде вы создаете три процесса, не включая ваш основной процесс.

pid=fork()

сам по себе является оператором, который разветвляет новый процесс, даже если он находится внутри условия оператора if. После первого вызова fork() остальные коды будут выполняться дважды. поэтому следующий вызов fork будет вызываться дважды. Вы уже создали новый процесс.

fork возвращает ноль самому себе и идентификатор своего процесса своему родителю

Это означает, что процесс A разветвляется B (не из вашего кода)

 pid = fork();
 printf("pid is : %d",pid);

Оператор printf выполняется дважды (один для A и один для B). Для A он печатает (A является родителем)

pid is: 512 //некоторый целочисленный идентификатор процесса

и B отпечатки

пид: 0

Итак, в вашем вопросе

 if(pid=fork()==0)
  {
    printf("\n the child process is created");
    fun();
    exit(1);
  }

это второй форк, который уже выполняется дважды. Таким образом, каждое такое выполнение создает новый дочерний процесс. Для обоих дочерних элементов значение pid равно 0. Таким образом, ваш оператор печати выполняется, что вы и видите в выводе. Но для обоих родителей будет значение pid, и ваше условие if не будет выполнено, поэтому оно не будет печататься. Эти два дочерних процесса - ваши второй и третий процессы. Короче говоря, вы создаете 3 процесса вместе с основным процессом.

person Krishnabhadra    schedule 01.06.2011

Ваш код вызывает fork() несколько раз:

if(pid=fork()<0) /* calls fork() */
{ 
   ...
}
if(pid=fork()==0) /* also calls fork() */
{
   ...
}

Каждый успешный fork() создает новый дочерний процесс. Что еще хуже, второй fork() вызывается как родителем, так и первым потомком.

Если вы пытаетесь создать один дочерний процесс, вы должны вызвать fork() только один раз:

pid_t pid; /* note the correct return type of fork() */
...
pid = fork();
if (pid < 0)
{ 
   ...
}
else if (pid == 0)
{ 
   ...
}

Если вы хотите создать несколько дочерних процессов, родительский процесс может вызывать fork() в цикле.

Что касается таких вопросов, как «что делает exec?», я советую научиться использовать man. а затем возвращайтесь с конкретными вопросами, если что-то на справочных страницах остается неясным.

person NPE    schedule 01.06.2011

Вывод генерируется дважды, потому что вы разветвляете дважды:

if(pid=fork()<0)  // Fork #1
{ 
   printf("\nfailed to create the process\n");
}
if(pid=fork()==0) // Fork #2
person DevSolar    schedule 01.06.2011