PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIPE Probleme......


beos
2006-07-10, 16:24:03
Hi,

da ist einfach nicht weiterkomme - vielleicht könnt ihr mir helfen.

Das Programm bleibt einfach bei

if ((w_fifo = open (FIFO, O_WRONLY)) < 0)

hängen - es gibt aber keine Fehlermeldung....die Frage ist warum?


Hier das Listing:


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <errno.h>

#define FIFO "/tmp/fifo_0002"





int r_fifo, w_fifo;
char puffer[]="A";
char buf[1];



int main (void)
{

if ((mkfifo (FIFO, S_IRUSR | S_IWUSR)) == -1)
{
/* FIFO bereits vorhanden - kein fataler Fehler */
if(errno == EEXIST)
perror ("mkfifo() - FIFO Existiert schon - mache weiter");
else
{
perror("mkfifio()");
exit (EXIT_FAILURE);
}
}

if ((w_fifo = open (FIFO, O_WRONLY)) < 0)
{
perror ("open()");
exit (EXIT_FAILURE);
}
else
{
write (w_fifo, puffer, strlen(puffer));
}



if ((r_fifo = open (FIFO, O_RDONLY)) < 0)
{
perror ("open()");
exit (EXIT_FAILURE);
}



close (r_fifo);
close (w_fifo);


return (EXIT_SUCCESS);
}

Trap
2006-07-10, 19:22:02
man open:
When opening a FIFO with O_RDONLY or O_WRONLY set:

If O_NONBLOCK and O_NDELAY are clear:

An open() for reading only blocks until a process
opens the file for writing. An open() for writing
only blocks until a process opens the file for read-
ing.

beos
2006-07-11, 19:26:18
hmmm...

wenn ich das programm forke und den das Kind die PIPE zum lesen öffnen lasse - passiert genau das gleiche - das programm bleibt beim schreiben stehen.

-ich weiss immer noch nicht weiter !


/*Kindprozess liest aus dem FIFO */
if ((r_fifo = open (FIFO, O_RDONLY)) < 0)
{
perror ("open()");
exit (EXIT_FAILURE);
}
read (r_fifo, puffer, strlen (puffer));
close(r_fifo);

Trap
2006-07-11, 20:43:05
Bei mir geht es mit fork().

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <errno.h>

#define FIFO "/tmp/fifo_0002"

int r_fifo, w_fifo;
char puffer[]="A";
char buf[1];

int main (void)
{
int num;
if ((mkfifo (FIFO, S_IRUSR | S_IWUSR)) == -1)
{
/* FIFO bereits vorhanden - kein fataler Fehler */
if(errno == EEXIST)
perror ("mkfifo() - FIFO Existiert schon - mache weiter");
else
{
perror("mkfifio()");
exit (EXIT_FAILURE);
}
}

num=fork();
if(num) {
if ((w_fifo = open (FIFO, O_WRONLY)) < 0)
{
perror ("open()");
exit (EXIT_FAILURE);
}
else
{
write (w_fifo, puffer, strlen(puffer));
}
} else {
if ((r_fifo = open (FIFO, O_RDONLY)) < 0)
{
perror ("open()");
exit (EXIT_FAILURE);
}
}

close (r_fifo);
close (w_fifo);

return (EXIT_SUCCESS);
}

Ist nicht sauber geschrieben so, aber es blockiert zumindest nicht...