2015-05-10 3 views
2

Мы создаем простой процесс оболочки.fork и ждут дочернего процесса, похоже, совсем не ждут

вот код:

pid = fork(); 

     if (pid == -1) { 
      printf("fork error"); 

     }else if (pid > 0) { 
      wait(&status); 

     } 

     else if (pid == 0) { 
      execute(myarg); 

     } 

и здесь функция выполнения: недействительными выполнить (интермедиат ARGC) {

switch (argc) { 

case 1: 
    execlp(arg[0], arg[0], NULL); 
case 2: 
    execlp(arg[0], arg[0], arg[1], NULL); 
case 3: 
    execlp(arg[0], arg[0], arg[1], arg[2], arg[3], NULL); 
case 4: 
    execlp(arg[0], arg[0], arg[1], arg[2], arg[3], arg[4], NULL); 
default: 
    printf("Error in switch\n"); 
} 

моя проблема, как правило, если мы встречаем случай 1 ~ 4, нет проблем. но если мы встречаем по умолчанию, жесткий код для выхода из оболочки работает только, если я набираю exit с равным количеством «Ошибка в переключателе», который я получил. Помоги мне!!!

Результат, когда я не получаю «Ошибка в переключателе»:

kevinshell>> ls 
myshellw.c posix posix.c posix.c~ shell-l.c~ test test.c` 
kevinshell>> exit 

и здесь, когда есть ошибка:

kevinshell>> stuff 
Error in switch 
kevinshell>> stuff 
Error in switch 
kevinshell>> another 
Error in switch 
kevinshell>> exit 
kevinshell>> exit 
kevinshell>> exit 
kevinshell>> exit 
+0

IMHO вы должны взглянуть на 'exec vp', который предназначен для произвольного номера параметров ... –

ответ

2

Вы должны вызвать выход после Printf в значение по умолчанию дело. В противном случае ваш дочерний процесс никогда не выходит ...

Причина это работает для случаев 1-4 является то, что Exec * вызовы замены текущего образа процесса с запрошенным программой и в конечном счете, эта программа вызывает выход

От человека Exec:

The exec() family of functions replaces the current process image with a new process image. The functions described in this manual page are front-ends for execve(2). (See the manual page for execve(2) for fur‐ ther details about the replacement of the current process image.)

Если вы разместите полный код, я смогу более подробно объяснить, что ребенок делает после PRINTF линии (я предполагаю, что он порождает снова как обычные оболочки будет запускать этот код петля)

+0

!!!!!! ОНО РАБОТАЕТ!!!!! –

+0

Я добавил _Exit(); в конце printf и он выходит !!!! Спасибо!! –

+0

Вас очень приветствует (; –

Смежные вопросы