在Ubuntu中使用c程序的mknod函数

3

我正在尝试编写一个C程序,其中使用mknod命令,如下所示:

#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");
} 

并且做一些事情。它在Red Hat系统上运行良好,但在Ubuntu上出现无效参数错误。


你发布的代码无法编译。请复制并粘贴你正在使用的实际代码。 - bdonlan
#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("mnod错误"); } fdr=open("testfile",O_RDONLY); read(fdr,info,50); printf("\n 接收到的消息=%s",info); printf("\n"); } - asb
2
你应该将这个编辑到你的问题中,因为当它被压缩成一行时很难阅读... - bdonlan
3个回答

3

mknod已经被弃用,您不应该再使用它。如果要创建FIFO,请使用标准的mkfifo。如果要创建普通文件,请使用creat或带有O_CREAT选项的open。是的,mknod可以创建设备节点,在某些系统上可能仍然是这样做的方式,但在现代Linux系统中,您可以依赖内核和/或udevd来处理此操作。


1
hmm mkfifo("testfile",010666) ==> 失败,提示无效参数。 - asb
2
010666 不是一个有效的模式。正确的模式是 0666 - R.. GitHub STOP HELPING ICE
“mknod已被弃用”的说法没有依据。在文档页面https://pubs.opengroup.org/onlinepubs/9699919799/上没有任何弃用的迹象。而且这种说法也没有意义,因为“udevd”在用户空间运行,需要一种创建特殊文件的方式。 - beroal

2

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

'b'在这里不是一个非常明智的mknod参数。 mknod的参数应该是权限掩码(通过umask修改)和S_IFREG(对于常规文件)或S_IFIFO(对于FIFO)的按位OR。例如:

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


mknod("testfile",010666,0); 这个代码可以在 Linux [Red Hat] 上运行,但在 Ubuntu 上会出现相同的错误。 - asb
@asb,另外,您正在尝试使用哪个文件系统? - bdonlan
@asb,请在strace下运行您的程序;发布有关mknod调用的确切strace输出行。 - bdonlan
strace的输出非常大,我不确定应该在这里添加哪一行。 - asb
那个以 mknod 开头的 :) 它应该在最后面。 - bdonlan

0

你可以使用mknode函数创建命名的PIPI,但它也用于创建设备文件,因此您必须指定要使用用户权限创建哪个文件,并且dev类型为零

语法:

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

例如:

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

您还可以使用mkfifo API来创建文件,它是指定PIPE的,不需要指定要创建哪种类型的文件:

mkfifo()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接