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
vielen dank, wusste das nicht. Sollte ich den Fifo nach Erhalt von EOF schließen, bevor ich ihn wieder öffne – tech74
@ 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 für den Link! –