Передача информации для system () в многопоточной программе - PullRequest
1 голос
/ 01 марта 2012

У меня есть сообщение, сгенерированное вызывающей стороной exec() или system() или popen(), и я хочу передать его дочернему процессу. Изменить env можно одним способом, но в многопоточной программе изменение env на putenv() или setenv() небезопасно. Я не могу пройти через argv дочернего процесса.

Запись чего-либо в какой-либо файл является одним из вариантов, но как мы можем определить, какое конкретное сообщение передается от какого родителя и предназначено для какого потомка? Одним из способов является добавление родительского pid к сообщению, и ребенок может найти сообщение с соответствием ppid. Но когда несколько потоков вызывают popen(), будет несколько сообщений с одинаковым pid.

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

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

0 голосов
/ 01 марта 2012

Я не специалист, но вот идея:

Оболочки позволяют использовать «временные» переменные среды. Например, вы можете сделать (в zsh):

% MSG="Hello" my_prog
% echo $MSG

%

Может быть, вы могли бы сделать что-то подобное? может быть, это потребует запуска вашей команды в под-оболочке?

...