Будет ли POSIX system (3) вызывать асинхронную команду оболочки немедленно? - PullRequest
0 голосов
/ 14 апреля 2011

Например, system("sh /mydir/some-script.sh &")

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Да, оболочка разветвит скрипт и немедленно вернется, но у вас нет простого способа узнать, как и закончился ли скрипт.

«Правильный» способ выполнить такую ​​асинхронную команду: fork(2) ваш процесс, вызовите execve(2) в дочернем файле с двоичным файлом, установленным в /bin/sh, и одним из аргументов, указанным в имени вашего скрипта. и периодически опросите дочерний элемент от родителя с помощью системного вызова waitpid(2) с параметром WNOHANG. Когда waitpid возвращает -1, вы знаете, что скрипт завершился, и вы можете получить его код возврата.

Фактически, то, что делает system(3), почти то же самое, за исключением того, что вызов waitpid блокируется, пока процесс не завершится.

1 голос
/ 14 апреля 2011
system("sh /mydir/some-script.sh &")

выполняет

/bin/sh -c 'sh /mydir/some-script.sh &'

system вернется, как только вернется внешняя оболочка, что произойдет сразу после запуска внутренней оболочки. Ни одна из оболочек не будет ждать завершения some-script.sh.

$ cat some-script.sh
sleep 1
echo foo

$ /bin/sh -c 'sh some-script.sh &' ; echo bar ; sleep 2
bar
foo
...