LINUX.ORG.RU

Запустить fork в интерактивном режиме

 , , , ,


0

1

Нужно из программы запустить редактор с аргументами. Код (без обработки ошибок) такой:

if ((editor_pid = fork ()) == 0) {
    editor = getenv ("EDITOR");
    editor = strdup (editor);
    execlp (editor, editor, file_name, (char*)0);
}
waitpid (editor_pid, &editor_status, 0);

Проблема: некоторые редакторы (проверил nano и vi) отказываются выполняться, потому что запущены не в интерактивном режиме, выдавая следующие ошибки:

vi:

[Using open mode]

Open and visual must be used interactively

nano:

Too many errors from stdin

Самое досадное то, что мой привычный vis работает нормально.

Так вот, собственно, как запустить editor в интерактивном режиме?

Ответ на: комментарий от mord0d

Спасибо, по описанию то, что нужно. Я правильно понимаю, что мне придется передавать весь ввод-вывод между родительским и дочерним терминалами?

Siborgium ★★★★ ()
Ответ на: комментарий от Siborgium

А вот этого я уже не знаю. Посмотри код /usr/sbin/daemon из FreeBSD, он занимается тем, что ты хочешь изобрести.

mord0d ★★★★★ ()

char command[PATH_MAX*2+2] = {0};
snprintf(command, sizeof( command )-1,«%s %s» getenv(«EDITOR»), file_name);
editor_status = system(command);

mittorn ★★★★★ ()

Честно говоря, у меня твой код прекрасно запускает и nano, и vi. И не понимаю, почему надо отдельный виртуальный терминал создавать, если ты процессу-потомку готов свой собственный одолжить.

Как ты свою программу запускаешь? Может, у тебя ввод или вывод не подсоединены к терминалу? Верно ли перед выполнением execlp, что isatty(0), isatty(1) и isatty(2) все возвращают 1?

Конечно, на практике, если аккуратно писать такой код, надо разбираться, что будет с сигналами, но для этого вопроса пофиг.

proud_anon ★★★★★ ()

popen и pipe на перенаправление потоков //тред не читал

anonymous ()
Ответ на: комментарий от proud_anon

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

Это так, но тогда, полагаю, нужно как-то сообщить системе, что терминал полностью передается дочернему процессу? С псевдотерминалами это достаточно просто делается.

Как ты свою программу запускаешь?Может, у тебя ввод или вывод не подсоединены к терминалу? Верно ли перед выполнением execlp, что isatty(0), isatty(1) и isatty(2) все возвращают 1?

Спасибо, это и оказалось проблемой. Программу я запускал примерно так:

echo ... | ./a.out

Соответственно, isatty(STDIN_FILENO) == 0, остальные 1.

Что лучше сделать в таком случае?

Siborgium ★★★★ ()
Последнее исправление: Siborgium (всего исправлений: 1)
Ограничение на отправку комментариев: только для зарегистрированных пользователей