заменить system () неблокирующей функцией - PullRequest
5 голосов
/ 01 октября 2010

Я не хочу использовать system () в моей C-программе, потому что system (3) блокирует, а это не то, что я хочу.Каков оптимальный способ сделать это?

Ответы [ 5 ]

12 голосов
/ 01 октября 2010

Я думаю, что быстрое и грязное действие - вызвать sytem (команду &).& будет порождать новый процесс.

8 голосов
/ 01 октября 2010

Используйте fork(), чтобы создать новый процесс, а затем используйте system() (или любую функцию exec) в нем. Исходный процесс сможет продолжить выполнение.

7 голосов
/ 01 октября 2010

Ответ зависит от вашей реальной цели.Вы не говорите, на какой платформе вы работаете, и я очень мало знаю о Windows, поэтому это касается только ваших опций в linux / unix.

  1. Вы просто хотите создать другую программуи не нужно взаимодействовать с ним.В этом случае вызовите fork(), а затем в дочернем процессе выполните execve() (или связанную функцию).

  2. Youхочу взаимодействовать с другой программой.В этом случае используйте popen().

  3. Вы хотите, чтобы часть вашей программы выполнялась как подпроцесс.В этом случае используйте fork() и вызывайте любые функции, которые вам нужны для запуска в дочернем процессе.

  4. Вам необходимо взаимодействовать с частью вашей программы, выполняющейся в качестве подпроцесса.Позвоните pipe(), чтобы у вас был дескриптор файла для связи, затем наберите fork() и используйте пару дескрипторов файлов для связи.Кроме того, вы можете общаться через сокет, очередь сообщений, общую память и т. Д.

6 голосов
/ 01 октября 2010

Возможно, вы захотите использовать popen. Он создает новые процессы и позволяет перенаправить вывод процесса на собственный процесс.

3 голосов
/ 01 октября 2010

Если в Windows, используйте функцию ShellExecute() из Windows API.

Если в Unix, выберите fork(), затем system(), как указано.

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