подскажите пжлста как можно запустить файл через функцию exec чтобы вывод из этого файла перенаправлялся в другой файл. Заранее спасибо.
>подскажите пжлста как можно запустить файл через функцию exec чтобы вывод из
>этого файла перенаправлялся в другой файл. Заранее спасибо.Просто добавь к имени запускаемого файла строку типа " > outfile.txt".
>>подскажите пжлста как можно запустить файл через функцию exec чтобы вывод из
>>этого файла перенаправлялся в другой файл. Заранее спасибо.
>
>Просто добавь к имени запускаемого файла строку типа " > outfile.txt".это то понятно, тока через функцию exec не прокатывает....не понимает что это перенаправление вывода...может есть какие то тонкости ?
man popen?
>man popen?Это выход, но только если в одну сторону - или читать или писать (сам до сих пор не пойму, неужели впадлу было сделать дуплексную схему? ;). А если хочется полного интерактива, то лепим 2 пайпа, форкаемся, в дочернем процессе fdopenами/freopenaми перебиваем свой stdin/stdout на эти пайпы и делаем exec, а в родительском через эти пайпы читаем/пишем в запущенный процесс. Так, имхо, простору для творчества куда больше, чем с popenом.
отэческий процесс:
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 кося под пользователя ;)
>отэческий процесс:
>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();
>>отэческий процесс:
>>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);
.....
:)
>Так, безусловно, изящнее, и для линуха 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.
>Хммм, по-моему из man однозначно понятно что по posix самый младший по
>номеру дескриптор. Можно конечно и dup2.Вынужден признать что был неправ и невнимателен ;)