The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Каким образом bash показывает приглашение?, !*! Towellie, 26-Янв-09, 17:05  [смотреть все]
Вобщем наколбасил программу для проброса стандартного ввода/вывода(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[i].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;
}




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру