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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pipes 
V
    Опции темы
Ak47black
  Дата 21.9.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Здравствуйте.
Помогите пожалуйста найти ошибку в коде
Код

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
/*
 *
 */
int main (int argv, char** argc)
{
    int pfildes[2];
    pid_t pid;
 
    if (pipe(pfildes) == -1)    {perror("error creating pipe"); exit(1);}
    if ((pid = fork()) == -1)   {perror("error creating child process"); exit(1);}
    else if (pid == 0) {        /* child:                      */
          close(pfildes[0]);    /* close read end of pipe               */
          dup2(pfildes[1], 1);   /* make 1 same as write-to end of pipe  */
          close(pfildes[1]);    /* close excess fildes                  */
          execlp("ls", "-1", NULL);
          perror("error executing child process");       /* still around?  exec failed           */
          _exit(1);             /* no flush                             */
        }
    else {                      /* parent:               */
          int status;
          waitpid(pid, &status, 0);
          if (WIFEXITED(status))
          {
              printf("[ls] executed ok");
          }
          else
          {
              perror("error executing child process");
          }
          close(pfildes[1]);    /* close write end of pipe              */
          dup2(pfildes[0],0);   /* make 0 same as read-from end of pipe */
          close(pfildes[0]);    /* close excess fildes                  */
          execlp("cut", "-c", "44-56", NULL);
          perror("error executing child process");       /* still around?  exec failed           */
          exit(1);            
        }

}

Хочу запустить этим кодом вот такую сложную команду
Цитата

ls -l | cut -c 44-56

пробую запустить, но получаю
Цитата

-c: you must specify a list of bytes, characters, or fields
Try `-c --help' for more information.


Это сообщение отредактировал(а) Ak47black - 21.9.2010, 13:57
PM MAIL   Вверх
Sartorius
Дата 21.9.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



Возможно так ?
Код

execlp("cut", "-c 44-56", NULL);

PM MAIL ICQ   Вверх
Ak47black
Дата 21.9.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



тоже самое
Цитата

-c: you must specify a list of bytes, characters, or fields
Try `-c --help' for more information.


Это сообщение отредактировал(а) Ak47black - 21.9.2010, 14:10
PM MAIL   Вверх
Void
Дата 21.9.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Код
execlp("cat", "cat", "-c", "44-56", NULL);

Аналогичная ошибка для ls. argv[0] кто предоставлять будет?


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ak47black
Дата 21.9.2010, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Подправил, теперь работает без ошибок, но выдаёт просто пустое n-е количество строк, а если просто набрать в консоле 
Цитата

ls -l | cut -c 44-56

то нетак.
Может тут опять что-то из-за директории?
PM MAIL   Вверх
Void
Дата 21.9.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Вызов ls поправил? Всё должно работать.
Кстати, ждать (waitpid) завершения ls перед запуском cut нельзя. Если вывод ls будет больше, чем PIPE_BUF, то дочерний процесс заблокируется при записи в трубу и будет deadlock.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ak47black
Дата 21.9.2010, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Вроде-бы как всё должно быть
Код

    int pfildes[2];
    pid_t pid;
 
    if (pipe(pfildes) == -1)    {perror("error creating pipe"); exit(1);}
    if ((pid = fork()) == -1)   {perror("error creating child process"); exit(1);}
    else if (pid == 0) {        /* child:                      */
          close(pfildes[0]);    /* close read end of pipe               */
          dup2(pfildes[1], 1);   /* make 1 same as write-to end of pipe  */
          close(pfildes[1]);    /* close excess fildes                  */
          execlp("ls", "ls", "-1", NULL);
          perror("error executing child process");       /* still around?  exec failed           */
          _exit(1);             /* no flush                             */
        }
    else {                      /* parent:               */
          close(pfildes[1]);    /* close write end of pipe              */
          dup2(pfildes[0],0);   /* make 0 same as read-from end of pipe */
          close(pfildes[0]);    /* close excess fildes                  */
          execlp("cut", "cut", "-c", "44-56", NULL);
          perror("error executing child process");       /* still around?  exec failed           */
          exit(1);            
        }

но выдаёт пустые строки
PM MAIL   Вверх
Void
Дата 21.9.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Код
execlp("ls", "ls", "-1", NULL);
//                 ^^^^ ы? ыгы.



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ak47black
Дата 21.9.2010, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Что?  smile  smile  smile 
Параметр, как параметр :|

Это сообщение отредактировал(а) Ak47black - 21.9.2010, 18:01
PM MAIL   Вверх
Void
Дата 21.9.2010, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Единица у тебя там, а хотел -l небось smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ak47black
Дата 21.9.2010, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



Аааааа, так вот оно в чём!  smile 
Кстати в этом, моём NetBeans'е в котором я кодю, l и 1 выглядят полностью одинаково  smile
Спасибо!

Добавлено через 4 минуты и 47 секунд
А на форуме
Код

1 l

Тоже l маскируется под 1

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

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

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


 




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


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

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