Неблокирующая версия системы () - PullRequest
19 голосов
/ 16 июня 2009

Я хочу запустить процесс из моей программы на c, но я не хочу ждать завершения этой программы. Я могу запустить этот процесс, используя system (), но это всегда ждет. Кто-нибудь знает о «неблокирующей» версии, которая вернется сразу после запуска процесса?

[Правка - Дополнительное требование] Когда исходный процесс завершится, дочерний процесс должен продолжить работу.

Ответы [ 5 ]

19 голосов
/ 16 июня 2009

В вашем системном вызове есть одна опция, сделайте следующее:

 system("ls -l &");

аргумент & в конце аргументов командной строки разветвляет запущенную задачу.

16 голосов
/ 16 июня 2009

Почему бы не использовать fork() и exec() и просто не звонить waitpid()?

Например, вы можете сделать следующее:

// ... your app code goes here ...
pid = fork();
if( pid < 0 )
    // error out here!
if( !pid && execvp( /* process name, args, etc. */ )
    // error in the child proc here!
// ...parent execution continues here...
7 голосов
/ 16 июня 2009

Обычный способ сделать это, и на самом деле вы больше не должны использовать system (), это popen .
Это также позволяет вам читать или писать из stdin / out порожденного процесса

edit: смотрите popen2 (), если вам нужно читать и писать - thansk quinmars

1 голос
/ 21 июня 2009

Вы можете использовать функцию posix_spawnp (). Это очень похоже на system (), чем комбинация fork и exec *, но неблокирует.

0 голосов
/ 16 июня 2009

В конце концов, этот код работает. Немного несоответствия вышеприведенных ответов:

pid = fork();

if (!pid)
{
    system("command here &");
}

exit(0);

Не совсем уверен почему работает, но делает то, что мне нужно, спасибо всем за помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...