как правильно использовать fork () и exec () - PullRequest
4 голосов
/ 04 декабря 2011

У меня есть этот код;

pid_t process;
process = fork();

if (process < 0){
   //fork error
   perror("fork");
   exit(EXIT_FAILURE);
}
if (process == 0){
   //i try here the execl
   execl ("process.c", "process" , n, NULL);
}
else {
   wait(NULL);
}

Я не знаю, правильное ли это использование fork() и exec() в сочетании.Когда я пытаюсь запустить программу из bash, я не получаю никакого результата, поэтому я подумал, что это может быть проблемой в этой части кода.
Спасибо.

Ответы [ 2 ]

15 голосов
/ 04 декабря 2011

Одна проблема состоит в том, что

if (process = 0){

должен читать

if (process == 0){

В противном случае вы присваиваете ноль process и только вызываете execl, еслиresult не равен нулю (то есть никогда).

Кроме того, вы пытаетесь выполнить что-то под названием process.c.Нет сомнений, что можно иметь исполняемый файл с именем process.c.Однако условно имена, заканчивающиеся на .c, даются файлам исходного кода C.Если process.c действительно является файлом C, вам нужно сначала скомпилировать и связать его.

После того, как вы создали исполняемый файл, вам нужно либо поместить его где-нибудь в $PATH, либо указать его полный путь кexecle().Во многих средах Unix размещения его в текущем каталоге будет недостаточно.

Наконец, неясно, что означает n в вызове execle(), но имя указывает на числовую переменную.Вы должны убедиться, что это строка, а не, например, целое число.

0 голосов
/ 13 декабря 2011

Что ж, согласно ответам и комментариям выше, ваш код должен выглядеть примерно так:

pid_t process;
process = vfork(); //if your sole aim lies in creating a child that will ultimately call exec family functions then its advisable to use vfork

if (process < 0)
{
  //fork error
  perror("fork");
  exit(EXIT_FAILURE);
}
if (process == 0)
{
  //i try here the execl
  char N[MAX_DIGITS];//A correction here
  itoa(n,N);//write this function yourself
  execl ("process", "process" , N, NULL);// Here process is the name of the executable N is your original argument
  fprintf(stderr,"execl failed\n");//check for error in execl

}
else
{
  wait(NULL);
}

Обратите внимание на использование vfork вместо fork.Its, потому что это будет намного эффективнее. Причину можно найти здесь

...