Почему execl требует, чтобы я нажал Enter после запуска процесса?

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

Однако эта программа, написанная на 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, чтобы вернуться к командной строке bash. Почему?


person Koray Tugay    schedule 02.06.2015    source источник


Ответы (2)


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

Собственно, ты уже вернулся к подсказке, просто не понял.

Чтобы уточнить, проблема, с которой вы здесь столкнулись, заключается в том, что родитель не ждет выхода дочернего элемента и возвращается до того, как дочерний процесс завершит выполнение. Итак, приглашение оболочки возвращается, а затем вывод процесса 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

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

person Sourav Ghosh    schedule 02.06.2015

В этот момент мне нужно будет нажать Enter, чтобы вернуться к bash.

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

person Ignacio Vazquez-Abrams    schedule 02.06.2015
comment
Но почему я не вижу Korays-MacBook-Pro:~koraytugay$ ? - person Koray Tugay; 02.06.2015
comment
@KorayTugay Но вы делаете это сразу после вывода I am the child process. - person Some programmer dude; 02.06.2015
comment
О чем ты говоришь? Это наверху, до вывода ls. - person Ignacio Vazquez-Abrams; 02.06.2015