我正在为linux内核编写一个模块,我想在init函数中创建一些设备节点
int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
// Now I want to create device nodes with the returned major number
}
Run Code Online (Sandbox Code Playgroud)
我还希望内核为我的第一个节点分配一个次要编号,然后我将自己分配其他节点的次要编号.
我怎么能在代码中执行此操作.我不想使用mknod从shell创建设备
我正在学习从内核模块编程指南编写字符设备驱动程序,并用于mknod创建一个节点/dev以与我的驱动程序通信.
但是,在检查联机帮助页并观察这rmnod是一个不存在的命令之后,我找不到任何明显的删除方法.
什么是扭转效果mknod并正确删除创建的节点的正确方法/dev?
command-line kernel-module linux-device-driver linux-kernel mknod
我想在Python中创建一个新文件,因为我正在使用mknod命令,但是得到错误:
os.mknod();
AttributeError: module 'os' has no attribute 'mknod'
Run Code Online (Sandbox Code Playgroud)
我正在使用除'mknod'工作之外的窗口和属性.
我正在尝试使用/dev/net/tun设备创建 Docker 映像,以便可以在 Linux、Mac 和 Windows 主机上使用该映像。设备不需要访问主机的网络接口。
请注意,传递--device /dev/net/tun:/dev/net/tuntodocker run是不可取的,因为这仅适用于 Linux。
容器启动后,我可以通过运行手动添加设备:
$ sudo mkdir /dev/net
$ sudo mknod /dev/net/tun c 10 200
$ sudo ip tuntap add mode tap tap
Run Code Online (Sandbox Code Playgroud)
但是当我将这些行添加到 Dockerfile 时,它会导致错误:
Step 35/46 : RUN mkdir /dev/net
---> Running in 5475f2e4b778
Removing intermediate container 5475f2e4b778
---> c6f8e2998e1a
Step 36/46 : RUN mknod /dev/net/tun c 10 200
---> Running in fdb0ed813cdb
mknod: /dev/net/tun: No such file or directory
The command '/bin/sh -c …Run Code Online (Sandbox Code Playgroud) 语言:C 操作系统:Ubuntu
我只是尝试使用以下命令创建一个名为管道的 FIFO:
state = mknod("pipe.txt", S_IFIFO | 0666, 0);
Run Code Online (Sandbox Code Playgroud)
问题是我总是让状态的值为 -1(意味着它失败了)而不是 0。
perror 返回“pipe.txt:文件存在”
我不知道我应该如何调试这样的问题或可能是什么原因,希望任何人代码指导我出了什么问题。
(注意:文件 pipe.txt 与源文件位于同一路径。)
我正在尝试在 chroot 环境中运行一个程序,它需要/dev/random作为资源。手动我可以做ls -l,然后用 再次创建文件mknod c xx yy,但我需要让它自动,我不认为这些版本号从一个 linux 版本到另一个是不变的,所以这就是为什么我有以下问题:
我如何编写一个 bash 脚本来提取次要和主要数字/dev/random并将其与 mknod 一起使用?我可以使用,ls -l但我不知道如何提取它的子字符串...
的确切返回ls -l /dev/random是:
crw-rw-rw- 1 root root MINOR, MAJOR mars 30 19:15 /dev/random
Run Code Online (Sandbox Code Playgroud)
我想提取的两个数字是 MINOR 和 MAJOR。但是,如果有一种更简单的方法可以在没有 ls 和 mknod 的情况下创建节点,我将不胜感激。
我在GNU/Linux下运行一个服务器应用程序(用Java编写),它接受输入(来自stdin,我猜)并解释它运行一些命令.我不想在终端窗口中运行应用程序(我想运行一个守护进程),但我仍然希望能够随时输入命令.我以为我可以用fifos做到这一点,所以我用mknod创建它.问题是cat fifofile> java ...和cat fifofile | java ...由于某种原因失败并显示"找不到文件"错误.
仅使用cat进行读写,fifo可以完美地工作.
有没有办法解决这个问题,或者以其他方式实现同样的目标?
我正在通过莫里斯巴赫的Unix书中的一个例子.他写了一个简单的复制程序,如下所述.但是,当inputfile是目录文件时,它会失败.我偶然发现了opendir其他一些这样的API - 我应该使用它吗?
如果二进制文件可以使用它,为什么目录文件被认为是不同的?在Unix中,并不是所有被抽象为文件的内容,无论程序如何解释它.
另外,我如何扩展此程序以支持目录文件,然后创建一个mknod?我想测试一下,假设我在/home/user1 并且做了一个$./copy /home/user user-home-clone,mknod看看该目录将如何与家庭不同.我想user-home-clone可能没有对自身的引用,但是/home/user[尽管它会在/ home/user中存在一个名为user-home-clone的文件] 所有其他文件,因为当我们做副本时它不存在命令?
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
char buffer[2048];
int copy(FILE *source, FILE *destination)
{
int count;
while ((count = fread(buffer, 1, sizeof buffer , source)) > 0)
{
fwrite(buffer, 1, count, destination);
}
return 0;
}
int main(int argc, char* argv[])
{
int status;
FILE *source;
FILE *destination;
if (argc != 3)
{
printf("%s takes exactly 3 …Run Code Online (Sandbox Code Playgroud) 我需要创建一个目录mknod()(mkdir()在我的例子中使用is not),我会从某个目录调用该程序,并引入在前一个目录中创建新目录的路径.
例如:如果我/home/user/test/和里面test有/level1/,我想在level2里面创建目录level1,所以我会传递参数/level1/level2/
我有以下代码在我创建管道时有效,但是当我将模式更改为时S_IFDIR,它不会执行任何操作.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
void main(int argc,char *argv[]){
int status;
if ((status = mknod(argv[1], S_IFDIR,0)) == 1){
printf("error\n" );
}
exit(0);
}
Run Code Online (Sandbox Code Playgroud) 我想mknod在我的代码中使用来创建一个文件,但是man说
mknod()的唯一可移植用途是创建FIFO特殊文件.如果mode不是S_IFIFO或dev不为0,则mknod()的行为未指定.
这是否意味着,mknod不是真正可移植的,我应该用其他方式来创建一个函数?如何打电话open和即时close?哪种方式更安全?
mknod ×10
c ×4
linux ×3
directory ×2
linux-kernel ×2
bash ×1
command-line ×1
docker ×1
dockerfile ×1
fifo ×1
file ×1
module ×1
pipe ×1
posix ×1
python ×1
python-3.x ×1
shell ×1
stdin ×1
tun ×1