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

Поиск:

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


Опытный
**


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

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



помогите разобраться почему не работает ...
нужно написать маленькую  client - server прогу, используя pipes
вот код на си:
Код

#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 - 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(0, pipe1[0]);
//       close(0);

       /* Associate STDOUT with p2[1] instead STDOUT */
       dup2(1, pipe2[1]);
//       close(1);

       /* Associate STDERR with p3[1] instead STDERR */
       dup2(2, pipe3[1]);
//       close(2);

      //Process client...to be write
         system("sh ./test_t03.sh");

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

     /* close descriptors used by client */

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

       exit(0);
  }
  else /* child ==0, this is child - 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 ...to be write

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

     /* close  descritors used by server */

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

       exit(0);
    }
}

Код

#include "common.h"

void server(int writefd, int readfd, int readErrfd)
{
   char buff[MAXBUFF];
   char* line;
   int n;

   /* read line from stdin */
    while((fgets(buff, MAXBUFF, stdin))!=NULL)
    {
  /* if((line=fgets(buff, MAXBUFF, stdin))==NULL)
   {

     perror("server: wrong input:");
     exit(1);
   } */
  // else

    /* send line to client through write descriptor */

     printf("line from file is %s ", buff);
       n=strlen(buff);
       buff[--n]='\0';

     if(write(writefd, buff,n)!=n)
      {
        perror("server: wrong input:");
        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)
   {
//dodelat'

     printf("STDOUT:%s", buff);
}
}

sh script
Код

#!/bin/sh
######################################################################
## Name:
##   test_t03.sh
## Description:
##   It performs following activity:
##     - reads strings from STDIN
##     - all strings, containing word "error" in any case, are printed to STDERR
##     - all other strings are printed to STDOUT
######################################################################
while read x
do
    echo "x"
    echo "${x}" | grep -i error >&2
    echo "${x}" | grep -iv error
done




Добавлено @ 19:05
Дело в том что я ничего не помучаю от скипта (client), в чем проблема я не занаю?

Это сообщение отредактировал(а) sol78 - 24.11.2007, 19:07
PM MAIL   Вверх
MAKCim
Дата 24.11.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

dup2(pipe1[0], 0);
//       close(0);
       /* Associate STDOUT with p2[1] instead STDOUT */
       dup2(pipe2[1], 1);
//       close(1);
       /* Associate STDERR with p3[1] instead STDERR */
       dup2(pipe3[1], 2);



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

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


Опытный
**


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

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



MAKCim,  и что?

Добавлено через 2 минуты и 22 секунды
так я хочу, что всместо стандартных использовались эти потоки...
PM MAIL   Вверх
MAKCim
Дата 24.11.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sol78 @  24.11.2007,  19:17 Найти цитируемый пост)
MAKCim,  и что?

man читать по dup2


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

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


Опытный
**


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

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



первоночально скрипт использует стандартные потоки
а мне нужно, что бы коммуникация проходила через pipe потоки
поэтому я делаю так:

dup2(0, pipe1[0]);

dup2(int old, int new)
PM MAIL   Вверх
MAKCim
Дата 24.11.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



sol78, 
блин
ну в мане ж ясным языком написано
Цитата

int dup2(int oldfd, int newfd);
...
dup2() makes newfd be the copy of oldfd, closing newfd first if necessary.

поэтому надо так
Код

dup2(pipe1[0], 0);



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

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


Опытный
**


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

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



да так вообще не работает!!!!!
PM MAIL   Вверх
MAKCim
Дата 24.11.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sol78 @  24.11.2007,  22:32 Найти цитируемый пост)
да так вообще не работает!!!!! 

нет такого понятия как "работает чуть-чуть"
оно либо работает, либо нет
я тебе сказал как правильно использовать dup2
дальше сам смотри
вот пример, отлично работает
Код

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

int main() {
    int fds[2];
    pipe(fds);
    pid_t pid = fork();
    if (pid == 0) {
        close(fds[0]);
        write(fds[1], "maxim\n", 6);
        _exit(0);
    } else if (pid < 0) {
        perror(NULL);
        _exit(errno);
    }
    close(fds[1]);
    dup2(fds[0], STDIN_FILENO);
    system("./script");
    wait(NULL);
    return 0;
}

script
Код

#!/bin/bash

while read x; do
    echo $x
done



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

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


Опытный
**


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

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



вроде разобралась с дескрипторами,
Код


        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]);

 
но все равно не работает, не могу прочитать из скрипта...
определить в чем проблема тоже не могу, какие есть ср-ва дебага в линухе???
PM MAIL   Вверх
JackYF
Дата 25.11.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(sol78 @  25.11.2007,  15:37 Найти цитируемый пост)
какие есть ср-ва дебага в линухе??? 

gdb вообще-то...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
sol78
Дата 25.11.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



классный ответ!
как пользоваться, с учетом того что я всю жизнь писала в студии?


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


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


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

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



sol78, 
убери вот эту строчку
Код

while(wait((int*)0)!=childpid){}

функция system() сама вызывает wait()

Добавлено через 1 минуту и 14 секунд
Цитата(sol78 @  25.11.2007,  16:16 Найти цитируемый пост)
классный ответ!
как пользоваться, с учетом того что я всю жизнь писала в студии?

тут


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

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


Опытный
**


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

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



Цитата(MAKCim @ 25.11.2007,  16:30)
sol78, 
убери вот эту строчку
Код

while(wait((int*)0)!=childpid){}

функция system() сама вызывает wait()

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


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


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

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



Цитата(sol78 @  25.11.2007,  16:39 Найти цитируемый пост)
не помогло 

какой должен быть результат?
это неправильно?
Цитата

# ./a
maxim
line from file is maxim
falaleev
line from file is falaleev
STDOUT:
x
maxim
x
falaleev



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

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


Опытный
**


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

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



да похоже на правду
а я получаю:

line from file is This is output string #1
 line from file is This is ErrOr string #1
 line from file is This is OutPut sTrIng #2
 line from file is This is ErRor stRINg #2
 line from file is This is ERrOr string #3
 line from file is This is OutpUt STrIng #3
 line from file is This is OuTPut sTrIng #4
 line from file is THiS iS outPut sTRIng #5
client2:data read error:: Bad file descriptor
 smile  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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