2015-06-02 3 views
4

В bash, когда я набираю ls и нажимаю enter, запускается двоичный файл ls, и я снова вернусь к приглашению оболочки, ничего не сделав с моей стороны.Почему execl требует, чтобы я ударил «Enter» после запуска процесса?

Однако эта программа, написанная на C перекроют:

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

int main(void) 
{ 
    pid_t other = fork(); 
    // other will be 0 for the child process 
    // other will be the childs process' value in the parent process. 

    switch(other) { 
     case 0: 
      printf("%s %i\n", "I am the child process!", other); 
      execl("/bin/ls","ls",NULL);   
      return 0; 
     default: 
      printf("%s %i\n", "I am the parent process!", other); 
      return 1; 
    } 

} 

Почему?

Выход следующим образом:

Korays-MacBook-Pro:~ koraytugay$ ./a.out 
I am the parent process! 40309 
I am the child process! 0 
Korays-MacBook-Pro:~ koraytugay$ AndroidStudioProjects Movies   happyko   koray.i 
Applications  Music   hello.c   koray.o 
ClionProjects  Pictures  hello.sh  koray.s 
Code   Public   innbound  mssql 
Desktop   TheElementsFiles innbound-pf  nono.txt 
Documents  VirtualBox VMs  innbound_usage.log svn-key 
Downloads  a.out   k.txt   tugay.c 
IdeaProjects  asm.asm   klinnck   webtoolkit 
Koray.class  asm.hack  klinnck-pf 
Koray.java  cexamples  koray.a 
Library   fifa.sql  koray.c 

На данный момент мне нужно будет ударить Enter так, что я вернусь, чтобы колотить приглашение. Зачем?

ответ

5

На данный момент мне нужно будет ударить ENTER так, что я вернусь, чтобы колотить приглашение.

Фактически, вы уже вернулись к подсказке, вы просто этого не осознавали.

Чтобы выяснить, проблема , с которой вы сталкиваетесь, родитель не ждет, пока ребенок выйдет и вернется заранее, ребенок закончит выполнение. Итак, приглашение оболочки возвращается, а затем вывод из процесса chlid (вывод ls) печатается на выходе.

Если вы правильно заметили, у вас уже есть приглашение назад, и ваш вывод появится.

Korays-MacBook-Pro:~ koraytugay$ ./a.out 
I am the parent process! 40309 
I am the child process! 0 
****Korays-MacBook-Pro:~ koraytugay$***** AndroidStudioProjects Movies   happyko   koray.i 
Applications  Music   hello.c   koray.o 
ClionProjects  Pictures  hello.sh  koray.s 
Code   Public   innbound  mssql 
Desktop   TheElementsFiles innbound-p 

Выше, обратите внимание на отмеченную линию ****. Там у вас появилось приглашение вашей оболочки.

+1

Спасибо, дожидаясь, что процесс ребенка дал мне понять. –

+0

@KorayTugay добро пожаловать. :-) –

4

На этом этапе мне нужно нажать Enter, чтобы я вернулся в bash.

За исключением нет, вы уже находитесь в bash. Но все, что выводит после подсказки, кажется, что вы этого не делаете. Идите дальше, попробуйте другую команду.

+0

Но почему я не вижу Korays-MacBook-Pro: ~ koraytugay $? –

+0

@KorayTugay Но вы это делаете сразу после выхода «Я - дочерний процесс». –

+0

О чем ты говоришь? Это выше, до выхода ls. –