Implementacja obslugi potoku. (Linux c)

0

Witam,
Zagadnienie nad jakim sie głowię wygląda następująco. Program(pod linuxem) może przyjmować dane z potoku.
Przykład:

 1. $echo "Hello World" | ./a.out 
 2. Hello World
 3. $./a.out
 4. $ 

Zrealizowanie pierwszych dwóch linii nie jest problemem, taki potok jest 'potokiem nazwanym' i wystarczy odczytac to jest w pliku /dev/stdin

Realizuje to zagadnenie nastepujacy kod:

 #include <stdio.h>
 #include <stdlib.h>
 #define BUFFERSIZE    1
 int main(int argc, char **argv){
     unsigned char     buffer[BUFFERSIZE];
     FILE                         *instream;
     int                            bytes_read=0;
     int                            buffer_size=0;
     buffer_size=sizeof(unsigned char)*BUFFERSIZE;
     /* open stdin for reading */
     instream=fopen("/dev/stdin","r");
     /* did it open? */
     if(instream!=NULL){
         /* read from stdin until it's end */
         while((bytes_read=fread(&buffer, buffer_size, 1, instream))==buffer_size){
             fprintf(stdout, "%c", buffer[0]);
         }
     }
     /* if any error occured, exit with an error message */
     else{
         fprintf(stderr, "ERROR opening stdin. aborting.\n");
         exit(1);
        }
}//main

Jednak to co mnie interesuje to linijka 3 i 4 czyli aby program, jesli nie ma nic na wejsciu z potoku
czyli jesli nie ma nic w pliku /dev/stdin zakonczyl dzialanie i nie podejmowal interakcji w postaci oczekiwania na wprowadzenie danych. Oczywiscie to ze nie ma nic w pliku nie oznacza, ze funkcja dostanie znak konca pliku. Nie mam pomyslu jak to zrealizowac.

0

Poczytalem jeszcze troszke. I chyba poczatkowy trop byl mylny. Doszedlem do tego ze
(wg Linux Advanced Programming Guide strona 110 http://www.advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdf)
zapis:
$ ls | less
spowoduje powolanie przez basha dwoch potomkow, ls i less oraza utworzenie z kazdym z nich potoku, przy czym dla ls bedzie to potok do odczytu a dla less do zapisu. A nastepnie w jakis sposob (nie wazne jaki) spina te dwa potoki, tak ze nastepuje wymiana danych miedzy ls i less. Idac tym tokiem taki kod powinien mi dzialac, jednak nie dziala

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

void reader (FILE* stream)
{
        char buffer[1024];
        while (  !feof (stream)
                 && !ferror (stream)
                 && fgets (buffer, sizeof (buffer), stream) != NULL)
        fputs ( buffer, stdout );
}

int main ()
{
        int fds[2];
        pipe (fds);
        close (fds[1]);

        FILE* stream;
        stream = fdopen (fds[0], "r");
        reader (stream);
        close (fds[0]);
return 0;
}//main
0

Troche zle zrozumiales intencje mechanizmu potokow, niechce mi sie rozpisywac, ale mam nadzieje, ze to Ci pomoze (potoki jednokierunkowe, z ktorych korzysta powloka):
http://www.linuxpl.org/LPG/node9.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1