проблема с fork () - PullRequest
       2

проблема с fork ()

2 голосов
/ 15 июня 2010

Я пишу оболочку, которая разветвляется, родительский элемент читает входные данные, а дочерний процесс обрабатывает и выполняет его с помощью execvp.

псевдокод основного метода:

do{
 pid = fork();
 print pid;
 if (p<0) { error; exit; }
 if (p>0) { wait for child to finish; read input; }
 else { call function to parse input; exit; }
}while condition
return;

происходит то, что я никогда не вхожу в дочерний процесс (напечатанный pid всегда положительный, я никогда не вхожу в остальное). однако, если я не вызываю функцию синтаксического анализа и у меня просто есть выход, я правильно поочередно вводю parent и child.

full code:
int main(int argc, char *argv[]){

 char input[500];
 pid_t p;
 int firstrun = 1;

 do{

  p = fork();

  printf("PID: %d", p);

  if (p < 0) {printf("Error forking"); exit(-1);}

  if (p > 0){

   wait(NULL);
   firstrun = 0;
   printf("\n> ");
   bzero(input, 500);
   fflush(stdout);
   read(0, input, 499);
   input[strlen(input)-1] = '\0';

  }

  else exit(0);

  else { if (parse(input) != 0 && firstrun != 1) { printf("Error parsing"); exit(-1); } exit(0); }

 }while(strcmp(input, "exit") != 0);

 return 0;
}

EDIT:

- что еще выход (0) просто что-то, что я забыл там от игры вокруг

- добавление новой строки к принтам показывает, что на самом деле она работает правильно и вводит дочерний процесс; спасибо, проблема вроде в разборе

Ответы [ 5 ]

1 голос
/ 15 июня 2010

`if (p> = 0) {

if (p == 0) {/* chile process */}

else if (p > 0) {/* parent process */}

} еще {

/* handle the error returned by fork() */

} `

Я бы сделал это как приведенный выше псевдокод.

else exit(0); - это то, что дочерний процесс делает в вашем коде.

1 голос
/ 15 июня 2010

Один виновник else exit(0);

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

0 голосов
/ 15 июня 2010

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

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

Кажется совершенно бессмысленным разветвляться, поскольку вы ничего не выполняете в дочернем элементе, но вы ждетеребенок, чтобы закончить в родительском.Почему бы просто не вызвать parse от родителя?

0 голосов
/ 15 июня 2010

Поменять местами

else exit(0);

и

else { if (parse(input) != 0 && firstrun != 1) { printf("Error parsing"); exit(-1); } exit(0); }
0 голосов
/ 15 июня 2010

Ваше ядро ​​немного запутано со всеми вложенными if и else. Также есть несколько висячих else утверждений (else exit(0);). Я бы начал с уборки. Я не вижу никаких других логических проблем с вашим кодом. Это достаточно просто.

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