2010-08-12 7 views
9

i das folgende Bit von C-Code haben, die aus einem Rohr liest und sollte dann blockieren, aber es nie blockiertlesen Sperrung auf nicht Named Pipe

int pipe_fd; 
int res; 
int open_mode = O_RDONLY; 
char buf[100]; 
int bytes_read = 0; 

memset (buf, '\0', sizeof(buf)); 
pipe_fd = open(FIFO_NAME, open_mode); 

if (access(FIFO_NAME, F_OK) == -1) 
{ 
    res = mkfifo(FIFO_NAME, 0777); 
    if (res != 0) 
    { 
      fprintf (stderr, "Could not create fifo %s\n", FIFO_NAME); 
      exit (EXIT_FAILURE); 
    } 
} 

for(;;) 
{   
    do  
    {  
     res = read(pipe_fd, buf, sizeof(buf)); 
     bytes_read += res; 
    }while (res > 0); 

    // process data then go back and block 
    ............ 
} 

Es ist ein einfacher Puffer von einigen Code in einem Bash-Skript geschickt RS‘./test 1'

#!/bin/bash 

pipe=/tmp/pipe 

if [[ ! -p $pipe ]]; then 
    echo "Reader not running" 
    exit 1 
fi 

if [[ "$1" ]]; then 
    echo "some string" >$pipe 
else 
    echo "q" >$pipe 
fi 

betreiben ich das C-Code-Programm in gdb und zunächst nicht auf der Lese blockieren, aber sobald ich den bash-Skript, das C-Code nicht mehr blockiert nennen, tut es erfolgreich Lesen Sie die Daten von den Puffer und jedes Mal, wenn es liest, sind 0 Bytes gelesen also nicht sicher, warum es nicht mehr blockiert. Die Daten "einige Zeichenfolgen" werden auf der anderen Seite korrekt empfangen.

Ich brauche es nur dort zu sitzen für Prozessdaten sie wartet und dann gehen Sie zurück und wartet mehr

Antwort

14

ich das C-Code-Programm in gdb laufen und zunächst tut es Block auf der Lese aber sobald Ich rufe das Bash-Skript auf, der C-Code blockiert nicht mehr, es liest die Daten erfolgreich aus dem Puffer und jedesmal, wenn es liest, sind 0 Bytes gelesen, also nicht sicher, warum es nicht mehr blockiert. Die Daten "einige Zeichenfolgen" werden auf der anderen Seite korrekt empfangen.

0 bedeutet EOF. FIFO kann nur gelesen oder geschrieben werden, wenn Prozesse zum Lesen und Schreiben mit ihm verbunden sind. Wenn es keine Writer mehr gibt (Ihre Shell-Skripte wurden beendet), werden die Leser über read() informiert, die das EOF zurückgeben.

FIFOs auf diese Weise verhalten sich mit Shell Rohr Logik z.B .:

$ mkfifo ./tmp1 
$ cat <input> ./tmp1 & 
$ cat <./tmp1> /dev/null 

Wenn read() EOF wird bestätigt, kompatibel zu sein, würde der zweite cat für immer blockieren.

ich es gerade brauchen, dort zu sitzen für Prozessdaten es warten und dann und für mehr

In Ihrem C-Programm Sie open() wieder müssen die FIFO warten zurück nach read() die EOF ersten Mal zurück .

P.S. Gefunden quite nice FIFO summary für Ihre. Überprüfen Sie die Tabelle auf der zweiten Seite.

+0

vielen dank, wusste das nicht. Sollte ich den Fifo nach Erhalt von EOF schließen, bevor ich ihn wieder öffne – tech74

+0

@ tech74: Offensichtlich. 'open()' weist einen neuen Dateideskriptor zu - der alte muss mit 'close()' freigegeben werden. Writer werden auch blockieren, bis Sie FIFO erneut für das Lesen öffnen. – Dummy00001

+1

+1 für den Link! –

0

Ihr Bash-Skript schließt das Rohr so ​​das C ein „eof“ Zustand

0

wird immer denke ich, Schreibseite Shell-Skript das Rohr jedes Mal, wenn Echo etwas schließen.

Also, das Schreib-Skript muss die Pipe öffnen und wiederholt den Opened-Deskriptor verwenden, um etwas zu schreiben und den Opened-Deskriptor schließlich zu schließen.