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_WRONLYopen. 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 lineprompt, and what you enter will be read by thecatand 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 atmpdirectory that is inside the current working directory. If thattmpdirectory doesn't exist,No such file or directorywill be the result.