Что делает execl ("/bin/emacs", "/etc/fstab"); делать?
Например :
int pid1 = fork();
printf("%s\n", "[1]");
int pid2 = fork();
printf("%s\n", "[2]");
if ((pid1 == 0) && (pid2 == 0)) {
printf("%s\n", "[3]");
execl("/bin/emacs", "/etc/fstab");
int pid3 = fork();
printf("%s\n", "[4]");
} else {
printf("%s\n", "[5]");
}
Что на самом деле делает линия?
execl
Семейство функций заменяет текущий образ процесса новым образом процесса.
Итак, эта программа запускается, просто давайте запустим программу:
Он разделит процессы на 2 с первым ответвлением:
[1]
[1]
После этого он снова разветвляется, поэтому у вас есть 4 процесса и отпечаток:
[2]
[2]
[2]
[2]
Дочерний процесс имеет pid == 0
, Есть один дочерний процесс с pid1
и один с pid2
так будет точно
[3]
И вот идет execl
, Что именно он делает в этот момент?
1 ответ
Вопрос привлек внимание к разветвлению новых процессов, кроме того, он имел намерение уточнить, как execl
Работа. Итак, он объявлен как:
int execl(const char *path, const char *arg, ...);
где - неопределенное имя пути для утилиты sh, file - файл образа процесса, а для execvp(), где arg0, arg1 и т. д. соответствуют значениям, переданным execvp () в argv [0], argv 1 и скоро.
Аргументы, представленные arg0,... являются указателями на символьные строки с нулевым символом в конце. Эти строки должны составлять список аргументов, доступных для нового образа процесса. Список заканчивается нулевым указателем. Аргумент arg0 должен указывать на строку имени файла, связанную с процессом, запускаемым одной из функций exec.
(взято из execl
документация)
Итак, это означает, что вы упускаете некоторые аргументы. В этом случае вы должны использовать его так:
execl("/bin/emacs", "/bin/emacs", "/etc/fstab", (char*)NULL);
Этот звонок должен начаться emacs
редактор с аргументом /etc/fstab
- что значит emacs
будет открыт редактор (если установлен) с содержанием fstab
файл находится в /etc/
,