Using mknod on Ubuntu in c program

12.6k Views Asked by At

I am trying to make a c program where i am using mknod command like

#include<stdio.h>
#include<fcntl.h>
#include<string.h>

char info[50];

main() {
    int fdr;
    int rc = mknod("testfile",'b',0);
    if(rc<0) {
        perror("Error in mnod");
    }
    fdr=open("testfile",O_RDONLY);
    read(fdr,info,50);
    printf("\n Received message=%s",info);
    printf("\n");
} 

And do some stuff. It works well on Red Hat system, but fails on ubuntu giving error invalid argument.

3

There are 3 best solutions below

5
On

mknod("testfile",'b',0);

'b' is not a very sensible argument for mknod here. mknod's argument should be a bitwise OR of a permissions mask (modified by umask) and S_IFREG (for a regular file) or S_IFIFO (for a FIFO). For example:

mknod("textfile", S_IFREG | 0666, 0);

3
On

mknod is deprecated; you should not be using it. If you want to create a FIFO, use the standard mkfifo. If you want to create an ordinary file, use creat or open with O_CREAT. Yes mknod can create device nodes, and on some systems might still be the way to do it, but on a modern Linux system you rely on the kernel and/or udevd to handle this.

0
On

You can create named PIPI using mknode function but it also user to create dev file so you have to specify which file you want to create with user permission and dev type is zero

Syntax:

mknode (const char* fileName, mode_t mode | S_IFIFO, (dev_t) 0)        

For example:

  mknode("pipe1",0777 | S_IFIFO, (dev_t) 0)

You also use mkfifo API for create file it's PIPE specify, In that no need to specify which kind of file you want to create:

mkfifo()