普通文件可以用open或者create创建,FIFO文件可以用pipe创建,mknod主要用于设备文件的创建。
在内核中,mknod是由sys_mknod实现的,代码如下:
asmlinkage long sys_mknod(const char * filename, int mode, dev_t dev) //比如filename为/tmp/server_socket,dev是设备号
{
int error = 0;
char * tmp;
struct dentry * dentry;
struct nameidata nd;
if (S_ISDIR(mode))
return -EPERM;
tmp = getname(filename);
if (IS_ERR(tmp))
return PTR_ERR(tmp);
if (path_init(tmp, LOOKUP_PARENT, &nd))//寻找父节点,这里就是/tmp节点
error = path_walk(tmp, &nd);
if (error)
goto out;
dentry = lookup_create(&nd, 0);//寻找/tmp/server_socket节点,返回该节点的dentry结构,但是dentry->d_inode为NULL
error = PTR_ERR(dentry);
if (!IS_ERR(dentry)) {
switch (mode & S_IFMT) {
case 0: case S_IFREG://普通文件
error = vfs_create(nd.dentry->d_inode,dentry,mode);
break;
case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK://字符设备,块设备,管道,socket文件
error = vfs_mknod(nd.dentry->d_inode,mode,dev);//创建/tmp/server_socket节点的inode结构,并关联到文件系统中
break;
case S_IFDIR:
error = -EPERM;
break;
default:
error = -EINVAL;
}
dput(dentry);
}
up(&nd.dentry->d_inode->i_sem);
path_release(&nd);
out:
putname(tmp);
return error;
}
lookup_create,寻找/tmp/server_socket节点,代码如下:
</