2016-09-12 2 views
-1

Найдено этот пример в сети и не может понять, почему эта строка не будет напечатанаПочему эта строка не будет напечатана? (C темы ++)

#include<stdlib.h> 
#include<unistd.h> 

int main() 
{ 
    pid_t return_value; 

    printf("Forking process\n"); 
    return_value=fork(); 
    printf("The process id is %d 
     and return value is %d\n", 
     getpid(), return_value); 
    execl("/bin/ls/","ls","-l",NULL); 
    printf("This line is not printed\n"); 
} 
+2

Вы прочитали документы для всех функций, которые были задействованы перед запросом? Как то, что делает 'execl'? И BTW, 'fork' создает процесс, а не поток. – Angew

ответ

5

Удачный никогда execl не возвращается, см man page:

Функции exec() возвращаются только в случае возникновения ошибки.

Вместо этого хост-процесс заменяется тем, что вы exec ING, в этом случае ls изображение процесса:

Семейство Exec() функций заменяет текущий образ процесса с новым образ процесса.

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

1

exec*() функции являются особыми в смысле, что они не возвращается. Типичная реализация этой функции «заменяет» модули текущего процесса, который фактически совпадает с запуском новой программы прямо внутри текущего процесса. В вашем случае новая программа - /bin/ls. Во время execl() все предыдущие изображения выгружаются из процесса, затем /bin/ls и все его зависимости загружаются, а управление передается в точку входа /bin/ls, которая вызывает функцию main() и так далее.

Таким образом, нет возможности вернуть управление после execl(), так как модуль, который его вызывает, больше не существует в адресном пространстве текущего процесса.

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