LINUX.ORG.RU

Перехват потока ввода/вывода.


1

0

Вопрос такой. Как перехватить потоки ввода вывода у запускаемого процесса? То есть, чтобы программа стала вроде "шлюза" для этого процесса. Popen обеспечивает только один способ - либо читать с процесса, либо писать в него. А надоЮ чтобы и читать и писать одновременно. Подскажите пожалуйста.

Уточню вопрос, чтобы было понятно:
Я пишу такую программу:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[]){

char buf[80];
int fd[2],nbytes;
pid_t childpid;
char string;

if (argc>1)
{
pipe(fd);
if((childpid=fork())==-1) exit(1);

if(childpid == 0){
dup2(fd[1],STDOUT_FILENO);
dup2(fd[0],STDIN_FILENO);
execlp(argv[1],argv[1],NULL);


}else{

while(1){
string = getchar();
write(fd[1],&string,strlen(&string));
nbytes=1;
while(nbytes>0){
nbytes= read(fd[0],buf,sizeof(buf));
buf[nbytes]=0;
printf("%s",buf);}
}
}

}
return 5;

}

Когда я запускаю её с mc,cat,date ит.п. все работает нормально. При попытке заставить её работать с bash ничего не происходит (т.е. ни bash не получает команды, ни обратного эффекта нет - от bash'a ничего не получаю). Что я делаю неправильно?

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

На чем пишешь ?
Если на С/С++ то делаешь пайпу (man pipe),
потом форк (man fork), потом меняешь stdin и stdout
(man dup2), закрываешь старое и exec.

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

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
char buf[80];
int p1[2], p2[2];
pid_t childpid;
char string;

if (argc>1)
{
pipe(p1);
pipe(p2);

if((childpid=fork())==-1) exit(1);

if(childpid == 0)
{
dup2(p1[1],STDOUT_FILENO);
dup2(p2[0],STDIN_FILENO);

close(p1[0]);
close(p1[1]);

close(p2[0]);
close(p2[1]);

execlp(argv[1],argv[1],NULL);
}
else
{
char buff[4096];
int readn;
int st;

close(p1[1]);
close(p2[0]);

fd_set s_read;
int max_fd = ((p1[0] > STDIN_FILENO)? p1[0]: STDIN_FILENO) + 1;

while(1)
{
FD_ZERO(&s_read);
FD_SET(p1[0], &s_read);
FD_SET(STDIN_FILENO, &s_read);
if(select(max_fd, &s_read, NULL, NULL, NULL))
{
if(FD_ISSET(STDIN_FILENO, &s_read))
{
if(0 < (readn = read(STDIN_FILENO, buff, 4096)))
{
printf("p2[1]<'%.*s'\n", readn, buff);
write(p2[1], buff, readn);
}
else
{
printf("StdIN closed.\n");
close(p1[0]);
close(p2[1]);
break;
}
}

if(FD_ISSET(p1[0], &s_read))
{
if(0 < (readn = read(p1[0], buff, 4096)))
{
printf("p1[0]>'%.*s'\n", readn, buff);
}
else
{
printf("fd[0] closed.\n");
close(p1[0]);
close(p2[1]);
break;
}
}
}
else
{
close(p1[0]);
close(p2[1]);
break;
}
}

wait( &st );
}
}

return 5;
}

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

Только bash нормально не заработает так как он терминал требует, но команды выполнять и так будет

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