2016-09-05 4 views
2

Там будет следующий код:Передача данных на стандартный ввод другого процесса ожидания на ppoll

#include <poll.h> 

int main(int argc, char *argv[]) 
{ 
    pollfd pd; 
    pd.fd = 0; 
    pd.events = POLLIN; 
    int ret = ::ppoll(&pd, 1, 0, 0); 
    return 0; 
} 

Это должно ждать некоторых данных о стандартном вводе и просыпается при появлении данных.

Запуск программы таким образом, кажется, что ppoll пробуждается (передача данных на стандартный ввод через трубку):

$ echo 1 | ./main 
$ 

Однако посылая что-то процесс из другой оболочки не просыпаются ppoll:

Первая оболочка:

$ ./main 

Вторая оболочка:

$ echo 1 > /proc/$(pgrep main)/fd/0 

После этого я просто вижу, что в первой оболочке напечатан 1, но ppoll не проснется. Как правильно отправлять данные в stdin процесса из другой оболочки, чтобы ppoll проснулся?

+0

Я не уверен, что ваш вопрос ясен. Когда вы говорите * «отправка чего-то в процесс из другой оболочки» * вы имеете в виду от другого 'tty'? Если это так, у них совершенно разные «stdin». –

ответ

3

Это просто невозможно, если только процесс не был специально запущен таким образом, чтобы обеспечить подачу ему данных извне (то есть через FIFO или трубу).

Даже если /proc/$PID/fd/0 (то есть стандартный входной поток) указывает на управляющий терминал текущего процесса, так что (при отсутствии перенаправления) /proc/$PID/fd/1 и /proc/$PID/fd/2 (т.е. стандартного вывода и стандартной ошибки потоков):

$ ls -l /proc/$$/fd 
lrwx------ 1 user user 64 Sep 6 01:36 0 -> /dev/pts/3 
lrwx------ 1 user user 64 Sep 6 01:36 1 -> /dev/pts/3 
lrwx------ 1 user user 64 Sep 6 01:36 2 -> /dev/pts/3 

терминал - псевдо-устройство, которое может считываться и записываться. Когда процесс считывает из него, терминал предоставляет данные, введенные с клавиатуры или другими способами (например, вставленными из буфера обмена). Когда вы напишите терминалу, он отобразит данные. Теперь, когда вы пишете /proc/$PID/fd/0, вы записываете на терминал, а не в стандартный поток ввода целевого процесса, поэтому ваши данные отображаются, но процесс остается безразличным.

Смежные вопросы