URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5626
[ Назад ]

Исходное сообщение
"функция exec"

Отправлено Анд , 10-Авг-06 14:16 
подскажите пжлста как можно запустить файл через функцию exec чтобы вывод из этого файла перенаправлялся в другой файл. Заранее спасибо.

Содержание

Сообщения в этом обсуждении
"функция exec"
Отправлено ufobject , 10-Авг-06 17:01 
>подскажите пжлста как можно запустить файл через функцию exec чтобы вывод из
>этого файла перенаправлялся в другой файл. Заранее спасибо.

Просто добавь к имени запускаемого файла строку типа " > outfile.txt".


"функция exec"
Отправлено Анд , 14-Авг-06 16:12 
>>подскажите пжлста как можно запустить файл через функцию exec чтобы вывод из
>>этого файла перенаправлялся в другой файл. Заранее спасибо.
>
>Просто добавь к имени запускаемого файла строку типа " > outfile.txt".

это то понятно, тока через функцию exec не прокатывает....не понимает что это перенаправление вывода...может есть какие то тонкости ?



"функция exec"
Отправлено int_0d , 14-Авг-06 16:14 
man popen?

"функция exec"
Отправлено Alexander S. Salieff , 16-Авг-06 17:17 
>man popen?

Это выход, но только если в одну сторону - или читать или писать (сам до сих пор не пойму, неужели впадлу было сделать дуплексную схему? ;). А если хочется полного интерактива, то лепим 2 пайпа, форкаемся, в дочернем процессе fdopenами/freopenaми перебиваем свой stdin/stdout на эти пайпы и делаем exec, а в родительском через эти пайпы читаем/пишем в запущенный процесс. Так, имхо, простору для творчества куда больше, чем с popenом.


"что то не сообразить как перебить stdin/stdout на пайпы"
Отправлено Анд , 18-Авг-06 17:13 
  

"что то не сообразить как перебить stdin/stdout на пайпы"
Отправлено Alexander S. Salieff , 21-Авг-06 15:44 
отэческий процесс:
mkfifo("/tmp/stdin_fifo", S_IRWXU);
mkfifo("/tmp/stout_fifo", S_IRWXU);
mkfifo("/tmp/stderr_fifo", S_IRWXU);

дочерний процесс:
freopen("/tmp/stdin_fifo", "r", stdin);
freopen("/tmp/stdout_fifo", "w", stdout);
freopen("/tmp/stderr_fifo", "w", stderr);
execl(....);

Теперь из родительского процесса можно писать в /tmp/stdin_fifo и читать из /tmp/stdout_fifo и /tmp/stderr_fifo кося под пользователя ;)


"что то не сообразить как перебить stdin/stdout на пайпы"
Отправлено Forth , 21-Авг-06 15:57 
>отэческий процесс:
>mkfifo("/tmp/stdin_fifo", S_IRWXU);
>mkfifo("/tmp/stout_fifo", S_IRWXU);
>mkfifo("/tmp/stderr_fifo", S_IRWXU);
>
>дочерний процесс:
>freopen("/tmp/stdin_fifo", "r", stdin);
>freopen("/tmp/stdout_fifo", "w", stdout);
>freopen("/tmp/stderr_fifo", "w", stderr);
>execl(....);
>
>Теперь из родительского процесса можно писать в /tmp/stdin_fifo и читать из /tmp/stdout_fifo
>и /tmp/stderr_fifo кося под пользователя ;)
А фифо-то зачем?
В родительском:
pipe(descr1);
pipe(descr2);
fork();
close(descr2[0]);
close(descr1[1]);
В дочернем после fork:
close(stdin);
dup(descr2[0]);
close(stdout);
dup(descr1[1]);
close(descr2[1]);
close[descr1[0]);
execl();

"что то не сообразить как перебить stdin/stdout на пайпы"
Отправлено Alexander S. Salieff , 21-Авг-06 16:06 
>>отэческий процесс:
>>mkfifo("/tmp/stdin_fifo", S_IRWXU);
>>mkfifo("/tmp/stout_fifo", S_IRWXU);
>>mkfifo("/tmp/stderr_fifo", S_IRWXU);
>>
>>дочерний процесс:
>>freopen("/tmp/stdin_fifo", "r", stdin);
>>freopen("/tmp/stdout_fifo", "w", stdout);
>>freopen("/tmp/stderr_fifo", "w", stderr);
>>execl(....);
>>
>>Теперь из родительского процесса можно писать в /tmp/stdin_fifo и читать из /tmp/stdout_fifo
>>и /tmp/stderr_fifo кося под пользователя ;)
>А фифо-то зачем?
>В родительском:
>pipe(descr1);
>pipe(descr2);
>fork();
>close(descr2[0]);
>close(descr1[1]);
>В дочернем после fork:
>close(stdin);
>dup(descr2[0]);
>close(stdout);
>dup(descr1[1]);
>close(descr2[1]);
>close[descr1[0]);
>execl();

Так, безусловно, изящнее, и для линуха 100 пудов прокатит. Но, к сожалению, основываецца на том факте, что dup отдаст тебе самый маленький из доступных свободных дескрипторов, а это никакой стандарт не гарантирует :(

Наверное, истина в 3ем варианте, чтобы сделать
dup2(descr2[0], stdin);
dup2(descr1[1], stdout);
.....
:)


"что то не сообразить как перебить stdin/stdout на пайпы"
Отправлено Forth , 21-Авг-06 16:11 
>Так, безусловно, изящнее, и для линуха 100 пудов прокатит. Но, к сожалению,
>основываецца на том факте, что dup отдаст тебе самый маленький из
>доступных свободных дескрипторов, а это никакой стандарт не гарантирует :(
>
>Наверное, истина в 3ем варианте, чтобы сделать
>dup2(descr2[0], stdin);
>dup2(descr1[1], stdout);
>.....
>:)

The dup() system call duplicates an existing object descriptor and
     returns its value to the calling process (newd = dup(oldd)).  The argu-
     ment oldd is a small non-negative integer index in the per-process
     descriptor table.  The value must be less than the size of the table,
     which is returned by getdtablesize(2).  The new descriptor returned by
     the call is the lowest numbered descriptor currently not in use by the
     process.


-----skip----

STANDARDS
     The dup() and dup2() system calls are expected to conform to ISO/IEC
     9945-1:1990 (``POSIX.1'').

HISTORY
     The dup() and dup2() functions appeared in Version 7 AT&T UNIX.

Хммм, по-моему из man однозначно понятно что по posix самый младший по номеру дескриптор. Можно конечно и dup2.


"что то не сообразить как перебить stdin/stdout на пайпы"
Отправлено Alexander S. Salieff , 21-Авг-06 16:13 
>Хммм, по-моему из man однозначно понятно что по posix самый младший по
>номеру дескриптор. Можно конечно и dup2.

Вынужден признать что был неправ и невнимателен ;)