mknod和mkfifo命令

Last Updated: 2023-07-02 14:11:12 Sunday

-- TOC --

mknod命令用于创建设备文件,字符设备,块设备或FIFO。mkfifo专用于创建FIFO,即命名管道。

mknod

mknod - make block or character special files

$ sudo mknod /dev/$NAME <c|b|u> major minor
$ sudo mknod /dev/$NAME p

one major one driver,major一般由驱动动态获取,minor的开始数字,在驱动程序内部自定义。一个major可以对应多个minor,一个driver控制多个devices。

Both MAJOR and MINOR must be specified when TYPE is b, c, or u, and they must be omitted when TYPE is p. If MAJOR or MINOR begins with 0x or 0X, it is interpreted as hexadecimal; otherwise, if it begins with 0, as octal; otherwise, as decimal. TYPE may be:

b create a block (buffered) special file

c, u create a character (unbuffered) special file

p create a FIFO

驱动major号查询:cat /proc/devices

查看所有设备的major和minor,如下命令,在原本显示文件大小的位置,就是major和minor。

$ ls -l /dev

mknod命令的-m参数很有用,可以在创建device file的时候,直接设定读写权限!

mkfifo

$ mknod name_pipe p
$ mkfifo name_pipe

此命令专门用来创建命名管道文件,在读写命名管道文件的时候,要注意:

  1. 当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞
  2. 读取管道中数据的时候,如果没有数据,读取进程会被堵塞
  3. 当写进程堵塞的时候,有读进程读取数据,那么写进程恢复正常
  4. 当读进程堵塞的时候,如果写进程写了数据,那么读进程会读取数据,然后正常执行后面的代码
$ mkfifo tp
$ echo '12345678' > tp &
[1] 2893
$ cat tp
12345678
[1]+  Done                    echo '12345678' > tp

-m参数用来设置权限。

mknod和mkfifo命令都会在系统中创建特殊的设备文件,因此如果在不使用-m指定权限,默认的权限由默认权限与umask命令的值确定。

本文链接:https://cs.pynote.net/sf/linux/shell/202112015/

-- EOF --

-- MORE --