I am trying to write 2 programs that will talk to each other using fifo pipe. I used the example here (section 5.2), but I changed the mknod there to mkfifo and tried to change gets to fgets. This is the code (of one program which writes into the fifo):
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h> /*mkfifo, open */
#include <sys/wait.h>
#include <sys/stat.h> /* mkfifo, open */
#include <fcntl.h> /*open */
#define FIFO_PATH "/home/hana/Desktop"
#define BUFFER_SIZE 300
int main()
{
char buffer[BUFFER_SIZE];
int fd;
int wStatus;
mkfifo(FIFO_PATH, 666);
printf("waiting for readers\n");
fd = open(FIFO_PATH, O_RDWR);
while (fgets(buffer, BUFFER_SIZE, fd), !feof(stdin))
{
if ((wStatus = write(fd, buffer, strlen(buffer))) == -1)
perror("write");
else
printf("speak: wrote %d bytes\n", wStatus);
}
return 0;
}
I get a compilation error: passing argument 3 of fgets makes pointer from integer. So fgets is expecting FILE* and not file descriptor. What should I do? change something so that fgets works? use another function?
I am compiling with gcc (ansi, pedantic).
Thanks
mkfifo()
just creates special node in filesystem. And you are free to open it in any way. Actually there are two alternatives - POSIX "non-buffered" I/O:open()/write()/read()
or standard buffered I/O:fopen()/fread()/fwrite()
. First family operates on file descriptors while second one uses so called file streams:FILE
. You can not mix these APIs freely. Just choose one and stick to it. Standard I/O library offers some useful extra capabilities comparing to low-level non-buffered I/O. Likefgets()
that you're trying to use. In this situation would be reasonable to use standard streams and replaceopen()
with:Thus program will use
FILE*
instead of plain file descriptors. Alsowrite()
need to be changed tofwrite()
immediately followed byfflush()
to guarantee that written data are passed to FIFO.P.S. In case of necessity it is possible to "wrap" low-level descriptors returned by
open()
(or something other) with standardFILE*
. Seefdopen()
. But it is much like a workaround to use standard I/O API with special file objects that can not be opened withfopen()
.