c форком, exec, проблемой getpid - PullRequest
0 голосов
/ 01 июня 2011

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

#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() с исходным кодом?

Пожалуйста, помогите этому начинающему парню.

Ответы [ 3 ]

1 голос
/ 01 июня 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, а затем вернуться с конкретными вопросами, если на страницах руководства что-то остается неясным .

0 голосов
/ 01 июня 2011

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

pid=fork()

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

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

То есть процесс A разветвляется как B (не от вашегоcode)

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

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

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

и B печатает

pid: 0

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

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

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

0 голосов
/ 01 июня 2011

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

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