Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pipes don't work 
:(
    Опции темы
MAKCim
Дата 25.11.2007, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



вот код
Код

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXBUFF 128
//----------- main -------------

void server(int writefd, int readfd, int readErrfd)
{
   char buff[MAXBUFF];
   char* line;
   int n;
    while((fgets(buff, MAXBUFF, stdin))!=NULL)
    {
     printf("line from file is %s ", buff);
       n=strlen(buff);
     if(write(writefd, buff,n)!=n)
      {
        perror("server: wrong input:");
        exit(1);
      }
   }
     close(writefd);
   while((n=read(readfd, buff, MAXBUFF))>0)
   {
     printf("STDOUT:%s", buff);
    }
}

 int main()
{
  int childpid, pipe1[2], pipe2[2], pipe3[2];

  if(pipe(pipe1)<0||pipe(pipe2)<0||pipe(pipe3)<0)
  {
    perror("can't create pipes: ");
    exit(1);
  }
  if((childpid=fork())<0)
  {
    perror("cant't fork: ");
    exit(1);
   }
   else if (childpid>0)
   {
       close(pipe1[1]);
       close(pipe2[0]);
       close(pipe3[0]);
       /* Associate STDIN with p1[0] instead STDIN */
       dup2(pipe1[0], 0);
       close(pipe1[0]);
       dup2(pipe2[1], 1);
       close(pipe2[1]);
       dup2(pipe3[1], 2);
       close(pipe3[1]);
         system("./script");
       close(pipe1[0]);
       close(pipe2[1]);
       close(pipe3[1]);
       exit(0);
 }
  else /* child ==0, this is child - server */
   {
       close(pipe1[0]);
       close(pipe2[1]);
       close(pipe3[1]);
        server(pipe1[1], pipe2[0], pipe3[0]);
       close(pipe1[1]);
       close(pipe2[0]);
       close(pipe3[0]);
       exit(0);
    }
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
sol78
Дата 25.11.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: нет
Всего: 0



я запускаю скрипт так:
system("sh ./script");
а ты просто
system("./script");
в чем разница? 
PM MAIL   Вверх
MAKCim
Дата 25.11.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



sol78, 
разница есть, но должны работать оба варианта
удали вот эти строчки
Код

close(pipe1[0]);
       close(pipe2[1]);
       close(pipe3[1]);



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
sol78
Дата 26.11.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: нет
Всего: 0



все ок , только появилась такая то проблема с выводом
сначала я вывожу из stdout скрипта и получаю нормальные строки
потом я вывожу из   stderr и получаю 3 строки целеком + какой то мусор.
Причем не важно от куда я вывожу 1 раз, в 2-ой я получаю все сразу....
Кто то может обьяснить мне что происходит?
Привожу полный код:
Код

#include "common.h"

//----------- main -------------

 main()
{
  int childpid, pipe1[2], pipe2[2], pipe3[2];

  /* create three pipes
    pipe1[0]-p1 read, pipe1[1]-p1 write
    pipe2[0]-p2 read, pipe2[1]-p2 write
    pipe3[0]-p3 read, pipe3[1]-p3 write 
 */

  if(pipe(pipe1)<0||pipe(pipe2)<0||pipe(pipe3)<0)
  {
    perror("can't create pipes: ");
    exit(1);
  }

  /* fork server process */

  if((childpid=fork())<0)
  {
    perror("cant't fork: ");
    exit(1);
   }
   else if (childpid>0) //This is parent - server
   {

        /* close descriptors unused by server:
        pipe1[0]-p1 close, pipe1[1]-p1 write
        pipe2[0]-p2 read,  pipe2[1]-p2 close
        pipe3[0]-p3 read,  pipe3[1]-p3 close
     */

       close(pipe1[0]);
       close(pipe2[1]);
       close(pipe3[1]);

      //Process server ...

       server(pipe1[1], pipe2[0], pipe3[0]);

     /* close  descritors used by server */

       close(pipe1[1]);
       close(pipe2[0]);
       close(pipe3[0]);
    
      /* wait child-server termination */
      while(wait((int*)0)!=childpid){}

       exit(0);
  }
  else /* child ==0, this is child - client */
   {

     /* close descriptors unused by client:
        pipe1[0]-p1 read,  pipe1[1]-p1 close
        pipe2[0]-p2 close, pipe2[1]-p2 write
        pipe3[0]-p3 close, pipe3[1]-p3 write
     */

       close(pipe1[1]);
       close(pipe2[0]);
       close(pipe3[0]);

       /* Associate STDIN with p1[0] instead STDIN */

        dup2(pipe1[0],0);
        close(pipe1[0]);

       /* Associate STDOUT with p2[1] instead STDOUT */

       dup2(pipe2[1],1);
       close(pipe2[1]);

       /* Associate STDERR with p3[1] instead STDERR */

         dup2(pipe3[1],2);
         close(pipe3[1]);

      //Process client...
         system("sh ./test_t03.sh");

      /* wait child-server termination */
//      while(wait((int*)0)!=childpid){}


       exit(0);

    }
}

Код

#include "common.h"

void server(int writefd, int readfd, int readErrfd)
{
   char buff[MAXBUFF];
   char outMsg[50];
   char errMsg[50]; 
   int n;
   
   /* read line from stdin */
    while((fgets(buff, MAXBUFF, stdin))!=NULL)
    {

    /* send line to client through write descriptor */

         n=strlen(buff);  
       if(write(writefd, buff,n)!=n)
        {
          perror("server: wrong input1:");
          exit(1);
        }   
    }
   close(writefd);
   
   /* read line from client through readfd and readErrfd. Print line from
      readfd as STDOUT:"line", from readErrfd as STDERR:"line" */

   while((n=read(readfd,buff, MAXBUFF))>0)
   {
         sprintf(outMsg,"STDOUT:%s",buff);  
         n=strlen(outMsg);    
       if(write(1,outMsg,n)!=n)
        {
            perror("server:data write error:"); 
            exit(1);
        }
    }
    if(n<0)
    {
        perror("server:data read error:"); 
        exit(1);
    }

   while((n=read(readErrfd, buff,MAXBUFF))>0)
    {
         sprintf(errMsg,"\nSTDERR:%s ",buff);
         n=strlen(errMsg);
       if(write(1,errMsg,n)!=n)
         {
             perror("server:data write error:");
             exit(1);
         }
    }
    if(n<0)
    {
        perror("server:data read error:");
        exit(1);
    }
}
   


Source file
Код


This is output string #1
This is ErrOr string #1
This is OutPut sTrIng #2
This is ErRor stRINg #2
This is ERrOr string #3
This is OutpUt STrIng #3
This is OuTPut sTrIng #4
THiS iS outPut sTRIng #5


Script
Код


#!/bin/sh

while read x
do
    echo "${x}" | grep -i error >&2 
    echo "${x}" | grep -iv error
done

успешний вывод
Код


STDOUT:This is output string #1
STDOUT:This is OutPut sTrIng #2
STDOUT:This is OutpUt STrIng #3
STDOUT:This is OuTPut sTrIng #4
STDOUT:THiS iS outPut sTRIng #5
STDERR:This is ErrOr string #1
STDERR:This is ErRor stRINg #2
STDERR:This is ERrOr string #3


PM MAIL   Вверх
MAKCim
Дата 27.11.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



sol78
нужно следить за данными, которые остаются в буфере после каждой операции
сделай так
Код

while((fgets(buff, MAXBUFF, stdin))!=NULL)
    {
    /* send line to client through write descriptor */
         n=strlen(buff);  
       if(write(writefd, buff,n)!=n)
        {
          perror("server: wrong input1:");
          exit(1);
        }   
        
    }
   close(writefd);
   
   /* read line from client through readfd and readErrfd. Print line from
      readfd as STDOUT:"line", from readErrfd as STDERR:"line" */
   while((n=read(readfd,buff, MAXBUFF))>0)
   {
         sprintf(outMsg,"STDOUT:%s",buff);  
         n=strlen(outMsg);    
       if(write(1,outMsg,n)!=n)
        {
            perror("server:data write error:"); 
            exit(1);
        }
        memset(buff, 0, MAXBUFF); /* добавлено */
    }
    if(n<0)
    {
        perror("server:data read error:"); 
        exit(1);
    }
   while((n=read(readErrfd, buff,MAXBUFF))>0)
    {
         sprintf(errMsg,"\nSTDERR:%s ",buff);
         n=strlen(errMsg);
       if(write(1,errMsg,n)!=n)
         {
             perror("server:data write error:");
             exit(1);
         }
        memset(buff, 0, MAXBUFF); /* добавлено */
    }



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
sol78
Дата 27.11.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 7.7.2007

Репутация: нет
Всего: 0



Нет, это не помогает...
Код

memset(buff, 0, MAXBUFF);

PM MAIL   Вверх
MAKCim
Дата 27.11.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



такой вариант
Код

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

#define MAXBUFF 128

//----------- main -------------
void server(int writefd, int readfd, int readErrfd)
{
   char buff[MAXBUFF];
   char outMsg[50];
   char errMsg[50];
   int n;

   /* read line from stdin */
    while((fgets(buff, MAXBUFF, stdin))!=NULL)
    {
    /* send line to client through write descriptor */
         n=strlen(buff);
       if(write(writefd, buff,n)!=n)
        {
          perror("server: wrong input1:");
          exit(1);
        }
    }
   close(writefd);
   FILE * fs = fdopen(readfd, "r");
   while (fgets(buff, MAXBUFF, fs) != NULL) {
        printf("STDOUT: %s", buff);
   }
   fs = fdopen(readErrfd, "r");
   while (fgets(buff, MAXBUFF, fs) != NULL) {
    printf("STDERR: %s", buff);
   }
}

 main()
{
  int childpid, pipe1[2], pipe2[2], pipe3[2];
  /* create three pipes
    pipe1[0]-p1 read, pipe1[1]-p1 write
    pipe2[0]-p2 read, pipe2[1]-p2 write
    pipe3[0]-p3 read, pipe3[1]-p3 write 
 */
  if(pipe(pipe1)<0||pipe(pipe2)<0||pipe(pipe3)<0)
  {
    perror("can't create pipes: ");
    exit(1);
  }
  /* fork server process */
  if((childpid=fork())<0)
  {
    perror("cant't fork: ");
    exit(1);
   }
   else if (childpid>0) //This is parent - server
   {
        /* close descriptors unused by server:
        pipe1[0]-p1 close, pipe1[1]-p1 write
        pipe2[0]-p2 read,  pipe2[1]-p2 close
pipe3[0]-p3 read,  pipe3[1]-p3 close
     */
       close(pipe1[0]);
       close(pipe2[1]);
       close(pipe3[1]);
      //Process server ...
       server(pipe1[1], pipe2[0], pipe3[0]);
     /* close  descritors used by server */
       close(pipe2[0]);
       close(pipe3[0]);

      /* wait child-server termination */
      while(wait((int*)0)!=childpid){}
       exit(0);
  }
     /* close descriptors unused by client:
        pipe1[0]-p1 read,  pipe1[1]-p1 close
        pipe2[0]-p2 close, pipe2[1]-p2 write
        pipe3[0]-p3 close, pipe3[1]-p3 write
     */
       close(pipe1[1]);
       close(pipe2[0]);
       close(pipe3[0]);
       /* Associate STDIN with p1[0] instead STDIN */
        dup2(pipe1[0],0);
        close(pipe1[0]);
       /* Associate STDOUT with p2[1] instead STDOUT */
       dup2(pipe2[1],1);
       close(pipe2[1]);
       /* Associate STDERR with p3[1] instead STDERR */
         dup2(pipe3[1],2);
         close(pipe3[1]);
      //Process client...
         system("sh ./test_t03.sh");
    return 0;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.