Вставка символа в буфер родительского процесса - PullRequest
3 голосов
/ 14 апреля 2011

Я пытаюсь написать программу, которая работает в фоновом режиме, которая может «печатать» в родительском процессе, например выдайте команды оболочки, как будто я сам набрал их на клавиатуре. Я пытался сделать это с ungetc(), чтобы вернуться к STDIN:

#include <stdio.h>

int main (int argc, char** argv) {
        ungetc('x', stdin);
        return 0;
}

Я бы ожидал, что делает:

$ gcc -o unget unget.c
$ ./unget&

Оставил бы меня в приглашении $ с x, как будто я только что набрал его, но вместо этого я ничего не получил. Я "потерял" STDIN, уйдя на задний план? Спасибо!

Ответы [ 4 ]

4 голосов
/ 14 апреля 2011

То, что вы пытаетесь сделать, просто не может работать.ungetc работает с буфером stdio FILE, а не с описанием открытого открытого файла, и, следовательно, нет возможности поделиться им с другим процессом.

Вы можете попробовать запустить интерактивный сеанс в screen и используя команду screen exec для перенаправления файловых дескрипторов через процесс, который будет вводить данные.Или вы могли бы реализовать что-то подобное самостоятельно, используя псевдо-tty устройства.

Далее, из ваших комментариев, я думаю, что вы пытаетесь сделать, это крайне плохая идея.Если вам не повезло, и вы вводите текст в интерактивном режиме, это может иметь катастрофические последствия.Например, для автоматизированной команды обработки изображений:

command_foo my_important_file

Теперь предположим, что вы набираете

rm -rf useless_crap

Бам !my_important_file только что удалили.

2 голосов
/ 14 апреля 2011

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

В оболочке используйте команду trap для настройки обработчика сигнала.Например:

trap "echo hello" USR2

Замените USR2 тем сигналом, который вы хотите использовать.Затем запустите дочерний процесс, который периодически отправляет сигнал своему родителю.

1 голос
/ 14 апреля 2011

Нет - ungetc только «выталкивает» символ обратно в программный собственный буфер, поэтому, когда следующий символ, который читает та же программа, будет тем, что было передано ungetc. Передача чего-либо обратно родителю требует чего-то совершенно другого (например, создание некоторых каналов).

0 голосов
/ 14 апреля 2011

Прямо на макушке моей головы, может быть, вы могли бы настроить трубы вашего терминала так, чтобы кутук вашего ребенка был смехом для родителя. В bash это будет выглядеть примерно так:

exec 6>&1
exec 7<&0
exec 1>&7
exec 0<&6

Затем, когда вы запускаете ваши программы, трубы должны быть инвертированы. Таким образом, все, что вы помещаете в cout, должно выходить в cin от вашего родителя (процесс bash в данном случае).

...