I'm trying to make a named pipe on c under linux using the mkfifo command. But when I run the program, I either get a "no such file or directory" error or absolutely nothing (console doesn't display anything)
Here is my code :
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define MAX_LINE 80
int main(int argc, char** argv) {
int create;
//mkfifo("/tmp/myfifo", 0666);
create = mkfifo("tmp/myfifo", 0666);
if (create==-1)
{
printf("error%s", strerror(errno));
}
char line[MAX_LINE];
int pipe;
pipe = open("/tmp/myfifo", O_WRONLY);
if (pipe==-1)
{printf("error");
}
printf("Enter line: ");
fgets(line, MAX_LINE, stdin);
write(pipe, line, strlen(line));
sleep (100);
close(pipe);
return 0;
}
I am still learning, and I don't understand what i'm doing wrong. Thanks for your help.
For a named pipe to be useful, somebody has to read it and somebody has to write it. Usually this will be 2 separate programs. Your program is the writer. Where is the reader?
If there is no reader, it is normal for the program to block on the
O_WRONLY
open. So when your program appears to be doing nothing, it's really just doing this:which waits for a reader to show up.
In another terminal, run
cat /tmp/myfifo
. The presence of a reader will allow the writer to make progress. Your program will wake up and move on to theEnter line
prompt, and what you enter will be read by thecat
and written to the second terminal.The other problem is an inconsistency in your filenames. In one place you wrote
"tmp/myfifo"
without a leading slash, so you are trying to create the named pipe in atmp
directory that is inside the current working directory. If thattmp
directory doesn't exist,No such file or directory
will be the result.