Перенаправление стандартного входа и выхода в C (Linux) - PullRequest
1 голос
/ 21 октября 2011

Я пытаюсь перенаправить как стандарт, так и выход из процесса, который собирается создать мой процесс, поэтому я могу двунаправленно общаться с этим процессом.

По сути, я пытаюсь выполнить Pythonpopen2 () в C.

Я не смог ничего найти по этому поводу, так как все, кажется, используют fork () в своих примерах, что удобно, потому что вы можете создавать pipe, fork, а затемdup () в дочернем процессе для изменения вашего stdin и stdout, однако в моем случае я не разветвляюсь, я на самом деле выполняю команду оболочки и хочу иметь возможность общаться с ней.

Ответы [ 3 ]

1 голос
/ 21 октября 2011

Вы не можете выполнить команду оболочки без разветвления процесса.Это делается внутренне такими функциями, как system, и вы должны просто сделать это явно для захвата stdin / stdout.После того, как вы закончите разветвление и настройку stdin / stdout через dup2 в pipe, которые вы создали ранее, вызовите exec со своей оболочкой, аргументом "-c" и командой оболочки, которую вы хотите разветвить.

0 голосов
/ 21 октября 2011

popen2 из Python выполняет процесс оболочки и реализуется с помощью popen (3).

popen (3) является частью стандарта POSIX и поддерживается в Linux.Однако обратите внимание, что popen может создавать только однонаправленную связь (только для чтения или только для записи).popen (3) - это оболочка для системного вызова pipe (2).

Если вы хотите одновременно выполнять ввод и вывод для одного и того же дескриптора, то вы входите в область сокетов.Вы можете реализовать сокеты UNIX (локальные коммуникации), см. Подробности в unix (7) - на man-страницах также есть соответствующие примеры C, поэтому я не буду здесь репостить.

0 голосов
/ 21 октября 2011

В некоторых Unix-системах это легко сделать благодаря наличию popen (3) поддержки двунаправленных каналов (большинство BSD, включая Mac OS; не знают о linux на моей голове), но это не обязательно, а другие поддерживают только одно направление с popen. Для тех, кому нужно установить две однонаправленные трубы, используя pipe (2), fork и exec.

...