LINUX.ORG.RU

Контроль стандартных потоков ввода и вывода программы из программы


0

0

Каламбур полчился :-)

Но смысл прост - как реализовать аналог команды popen но только в обе стороны, что бы процессу на stdin можно было послать что-нить и из его stdout чег-нить считывать ?

В винде это возможно, знаю точно. а как с этим в юниксах ?

тоже естественно возможно.. разбирается в каждой книжке по программированию в Unix. так что учите мат.часть так сказать :)

hint: обратить внимание на fork,dup,dup2..

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

> fork не катит :-) мне надо запустить ssh-клиента и провести сесию где-то далеко ...

:) тем более учить мат.часть :) На C всё равно Вы от fork/exec никуда не уйдёте :)

если допустимо использовать скрипты, я бы посоветовал expect, в нативном виде или в виде библиотеки для Perl. В примерах точно есть Ваша задачка "через ssh войти на другой хост, запустить программу, и провести с ней автоматизированный диалог"

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

спасибо, но #include <unistd.h>

extern char **environ;

int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg , ..., char * const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]);

ни одна из этих функций не возвращает каких либо дескрипторов к потокам запускаемой программы. Это делает только (?) popen, но создает односторонний pipe канал к одному из потоков в зависимости о режима. дублировать его дескриптор и окрывать поток вдругую сторону смысла нет.

Как при этом может помочь fork ума не приложу ?

на С/С++ программа ...

sur02111976
() автор топика

Алгоритм вкратце такой:
создаём 2 пайпа - один для чтения, второй для записи.
теперь форкаемся.
в потомоке:
с помощью dup2 заменяем стандартный вход\выход на пайпы
ну и exec

теперь родитель может читать\писать в эти пайпы как в стандартный вход\выход для порождённого процесса.

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

порождаемый процесс наследует файловые дескрипторы от родителя.. до fork надо подготовить 2 пары дескрипторов - через pipe() для дальнейшего общения с потомком, после fork`а поставить нужные дескрипторы в 0 и 1 (чтобы были вместо стандартных) через dup2.. после этого уже смело делать exec чего-там-надо.. в родителе надо только не забыть ловить нужные сигналы и добивать 'мёртвых' деток чтобы не плодить zombie

всё-же найдите одну-две толковые книги - они помогут гораздо лучше чем форум.

MKuznetsov ★★★★★
()

Помимо прочих правильных ответов рекомендуется почитать исходники какого-нибудь простенького шелла.

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

Спасибо всем, просто еще слегка виндовое мышление :-), что exec - новый чужой процесс и все.Не сразу вспомнил что exec в юниксе только заменяет код текущего процесса и после форка можно сделать с деткой что хочешь а потом заменить код на нужный ...

sur02111976
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.