Вобщем наколбасил программу для проброса стандартного ввода/вывода(stdin stdout stderr) через пайпы
запускаю таким образом bash - а тот не показывает приграшение на ввод каким способом он выводит приглашение на ввод? - Мне вообше login(Тоже молчит как партизан) нужен - просто баш нагляднее. А ls - работает нормально. Может есть еще какой то дескриптор?Вот моя программка - прокоипилируйте ее у себя и повводите какие нибудь команды ls там ошибки все три дескриптера пробрасываются - вам будет интересно.
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/poll.h>
int main()
{
int pid[2],pipe0[2],pipe1[2],pipe2[2];
char *prog1_argv[2],buffer[1024];
prog1_argv[0] = "/usr/local/bin/bash";
prog1_argv[1] = NULL;
/*
* Create the pipe
*/
if (pipe(pipe0) < 0)
{
perror ("pipe 0");
return 0;
}
if (pipe(pipe1) < 0)
{
perror ("pipe 1");
return 0;
}
if (pipe(pipe2) < 0)
{
perror ("pipe 2");
return 0;
}
/*
* Create a process space for the ls
*/
if ((pid[0]=fork()) < 0)
{
perror ("Fork failed");
return 0;
}
if (!pid[0])
{
/*
* Set stdout to pipe
*/
dup2(pipe0[1], 1);
dup2(pipe1[0], 0);
dup2(pipe2[1], 2);
//perror("ERRRORTWERQWWER!\n");
//printf("\n");
//printf("My pid is %d\n",getpid());
/* Execute the ls */
execvp(prog1_argv[0],prog1_argv);
}
if (pid[0])
{
/*parent*/
struct pollfd fds[3];
fds[0].fd = pipe0[0];
fds[0].events = POLLIN;
fds[1].fd = pipe2[0];
fds[1].events = POLLIN;
fds[2].fd = 0;
fds[2].events = POLLIN;
int i,len;
//buffer[0]=0;
while (1)
{
/* Опрашиваем с бесконечным интервалом ожидания
(обозначается -1) */
if (poll(fds, 3, 1000) < 0)
{
printf("Poll Error\n");
return 0;
}
//sleep(1);
for (i=0;i<3;i++)
{
switch (fds.revents)
{
default: /* Для события-ошибки */
printf("Error\n");
return 0;
case 0:
//printf("No Data\n");
break; /* Событий не произошло */
case POLLIN:
//printf("%d",i);
for (;;)
{
if(i==0) len = read( pipe0[0], buffer, sizeof(buffer));//stdout
if(i==1) len = read( pipe2[0], buffer, sizeof(buffer));//stderr
if(i==2)len = read( 0, buffer, sizeof(buffer));//stdin
//printf( "Recieved=%ld\n", len );
if ( len > 0 ) break;
}
buffer[len] = '\0';
if(i==0) printf("%d bytes was writed to stdout\n",fwrite(buffer, strlen(buffer), 1, stdout));
if(i==1) printf("%d bytes was writed to stderr\n",fwrite(buffer, strlen(buffer), 1, stderr));
if(i==2) printf("%d bytes was writed to pipe\n",write(pipe1[1],buffer, strlen(buffer)));
break;
}
}
}
}
return 1;
}