mknod命令

用途

创建特殊文件。

语法

只能由 root 用户或系统组成员运行

mknod Name { b | c } Major Minor

创建 FIFO(已命名的管道)

mknod Name { p }

描述

mknod 命令建立一个目录项和一个特殊文件的对应索引节点。第一个参数是 Name 项设备的名称。选择一个描述性的设备名称。mknod 命令有两种形式,它们有不同的标志。

mknod 命令的第一种形式只能由 root 用户或系统组成员执行。在第一种形式中,使用了b 或 c 标志。b 标志表示这个特殊文件是面向块的设备(磁盘、软盘或磁带)。c 标志表示这个特殊文件是面向字符的设备(其他设备)。

第一种形式的最后两个参数是指定主设备的数目,它帮助操作系统查找设备驱动程序代码,和指定次设备的数目,也就是单元驱动器或行号,它们是十进制或八进制的。一个设备的主要和次要编号由该设备的配置方法分配,它们保存在 ODM 中的 CuDvDr 类里。在这个对象类中定义了主要和次要编号以确保整个系统设备定义的一致性,这是很重要的。

在 mknod 命令的第二种形式中,使用了 p 标志来创建 FIFO(已命名的管道)。

标志

b表示特殊文件是面向块的设备(磁盘、软盘或磁带)。
c表示特殊文件是面向字符的设备(其他设备)。
p创建 FIFO(已命名的管道)。

------------------------------------------------------------------------

  c.创建虚拟设备(dev),日志记录的时候有的选项可能用到它们。在默认情况下,是使用/dev目录下的文件,但是由于我们需要把DNS限制到一个目录,所以必须完全把/dev下用到的文件(或者说设备)模拟过来才可以。

   ls -lL /dev/zero /dev/null /dev/random

  看到类似

  crw-rw-rw-  1 root   root    1,  3 2003-09-15 /dev/null
  crw-r--r--  1 root   root    1,  8 2003-09-15 /dev/random
  crw-rw-rw-  1 root   root    1,  5 2003-09-15 /dev/zero

  这样的,将其中的1,3这样的数字记录下来,这表示主设备号和次设备号(一般来说主设备号用来区分设备的种类;次设备号则是为了作唯一性区分,标明不同属性——注意,在unix系统中是把设备也当作文件来对待的),在redhat 9下,ls加不加-L参数都无所谓,但是在Solaris下则一定要加上才可以显示。

  mknod dev/null c 1 3
  mknod dev/zero c 1 5
  mknod dev/random c 1 8

============================================================================

mknod [options] name {bc} major minor
mknod [options] name p
GNU 选项(缩写):
[-m mode] [--help] [--version] [--]
描述
mknod 用指定名称产生一个FIFO(命名管道),字符专用或块专用文件。
文件系统中的一个专用文件存贮着三种信息(布朗型、整型、整型)。布朗型在字符文件与块文件之间作出选择,两个整型是主、次设备号。
通常,一个专用文件并不在磁盘上占用空间,仅仅是为操作系统提供交流,而不是为数据存贮服务。一般地,专用文件会指向一个硬件设备(如:磁盘、磁带、打印机、虚拟控制台)或者操作系统提供的服务(如:/dev/null, /dev/random)。
块文件通常类似于磁盘设备(在数据可以被访问的地方赋予一个块号,意味着同时设定了一个块缓存)。所有其他设备都是字符文件。(以前,两种文件类型间是有差别的。比如:字符文件I/O没有缓存,而块文件则有。)
mknod命令就是用来产生这种类型文件的。
以下参数指定了所产生文件的类型:
p
FIFO型
b
块文件
c
字符文件
GNU版本还允许使用u('unbufferd'非缓冲化),以保持与C语言的一致。
当创建一个块文件或字符文件时,主、次设备号必须在文件类型参数后给出。(十进制或八进制以0开头;GNU 版本还允许使用以0x开头的十六进制)缺省地,所产生的文件模式为0666('a+rw')。
选项
-m mode, --mode=mode
为新建立的文件设定模式,就象应用命令chmod一样,以后仍然使用缺省模式建立新目录。
GNU 标准选项
--help
在标准输出上显示使用信息并顺利退出。
--version
在标准输出上显示版本信息并顺利退出
--
终端选项列表。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux内核中,可以使用sys_mknod函数实现mknod命令。因此,在驱动中实现mknod命令的步骤如下: 1. 在驱动的初始化函数中,注册字符设备或块设备。 2. 在驱动中实现一个ioctl函数,用于接收用户空间传递的参数。 3. 在ioctl函数中,使用sys_mknod函数创建设备节点。需要注意的是,sys_mknod函数的第一个参数是设备节点名称,第二个参数是设备类型,第三个参数是设备号。 4. 将创建设备节点的结果返回给用户空间。 下面是一个简单的示例代码,用于在驱动中实现mknod命令: ``` #include <linux/fs.h> #include <linux/module.h> #include <linux/uaccess.h> static int my_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { char *dev_name = "/dev/my_device"; // 设备节点名称 int dev_major = 240; // 设备主设备号 int dev_minor = 0; // 设备次设备号 int dev_mode = 0666; // 设备权限 int result; printk(KERN_INFO "my_device: ioctl called\n"); switch (cmd) { case MY_IOCTL_MKNOD: // 使用sys_mknod函数创建设备节点 result = sys_mknod(dev_name, dev_mode | S_IFCHR, MKDEV(dev_major, dev_minor)); if (result < 0) { printk(KERN_ERR "my_device: failed to create device node\n"); return -1; } printk(KERN_INFO "my_device: device node created\n"); break; default: return -EINVAL; } return 0; } // 定义ioctl命令 #define MY_IOCTL_MAGIC 'm' #define MY_IOCTL_MKNOD _IO(MY_IOCTL_MAGIC, 1) static struct file_operations my_fops = { .owner = THIS_MODULE, .unlocked_ioctl = my_ioctl, }; static int my_device_init(void) { int result; // 注册字符设备 result = register_chrdev(240, "my_device", &my_fops); if (result < 0) { printk(KERN_ERR "my_device: failed to register device\n"); return result; } printk(KERN_INFO "my_device: device registered\n"); return 0; } static void my_device_exit(void) { // 卸载字符设备 unregister_chrdev(240, "my_device"); printk(KERN_INFO "my_device: device unregistered\n"); } module_init(my_device_init); module_exit(my_device_exit); ``` 在上面的代码中,驱动注册了一个字符设备,并实现了一个ioctl函数。当用户空间调用ioctl命令时,驱动会使用sys_mknod函数创建设备节点。需要注意的是,为了保证驱动能够正常运行,需要在驱动初始化时先创建设备节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值