LINUX.ORG.RU

C - конвеер.


0

0

if( pipe( fifo ) == -1 )
{
return -1;
}
read( fifo[0], buf, 10 );
printf( "%s", buf );
close( fifo[0] );
Почему вот это зависает при таком использовании:
ls | ~/a.out
?
Зависает на read.

anonymous

быстро курить маны на предмет pipe, fork, read, write

anonymous
()

Если по простому, то потому, что никто не пишет в тот fifo, из которого ты читаешь.

watashiwa_daredeska ★★★★
()

Гы ) Читай маны и свяжи STDIN_FILENO с fifo[1] man dup (2) тебе поможет.

OxiD ★★★★
()

гм... а может тебе просто из stdin читать а? ;-)

Ex ★★
()

Как я понимаю.
Создаем пайп для чтения(то бишь ls | ~/a.out).
Конструкция ls | создает временный файл для чтения с дескриптором
fifo[0]. Дулаю read.Осталось выдать на печать.Но виснет.
Запись мне не нужна то бишь конструкция ~/a.out |.
Это означает что fifo[1] и fork мне использовать не надо.

ps ману читал но там крайне минимальноая инфо и бес примеров.

anonymous
()

>гм... а может тебе просто из stdin читать а? ;-)

Гм, а это идея.

anonymous
()
Ответ на: комментарий от anonymous

>> Как я понимаю. Создаем пайп для чтения(то бишь ls | ~/a.out). Конструкция ls | создает временный файл для чтения с дескриптором fifo[0]. Дулаю read.Осталось выдать на печать.Но виснет. Запись мне не нужна то бишь конструкция ~/a.out |. Это означает что fifo[1] и fork мне использовать не надо.

>>ps ману читал но там крайне минимальноая инфо и бес примеров.

ох блин... попробуй ка сделать вот такое и посмотри что получится

#include <stdlib.h> #include <stdio.h>

int main(void) { int input_char;

printf("stdin->");

while ((input_char = fgetc(stdin)) != EOF) { fputc(input_char, stdout); }

printf("EOF\n"); return 0; }

Ex ★★
()
Ответ на: комментарий от anonymous

>> Только тогда нафига нужны пайпы? Извиняюсь за глупость.

%) no comments...

Ex ★★
()
Ответ на: комментарий от anonymous

> Только тогда нафига нужны пайпы? Извиняюсь за глупость.

в данном случае pipe и dup за тебя делает шелл.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> в данном случае pipe и dup за тебя делает шелл.

Вот как раз и ответ: pipe шеллу и нужен, чтобы такое делать.

const86 ★★★★★
()

//--cut--
  PROTOTYPE ("CString") int fds[2];
  pipe (fds);
  if (!fork ())
    {
      dup2 (fds[0], 0);
      dup2 (fds[1], 1);
      execl ("/bin/sh", "sh", "-c", getobjectptr (element (env->arg, 0)),
             NULL);
      exit (127);
    }
  *(int *) getobjectptr (find_object (env->env, "fdwrite")) = fds[1];
  *(int *) getobjectptr (find_object (env->env, "fdread")) = fds[0];
//--cut--

kmeaw ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.