WSL2中调用mknod()创建S_IFIFO管道失败,错误码95
问题:mknod创建FIFO失败,错误码95(Operation not supported)
问题重现
代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> int main() { char file[] = "pipe.txt"; int state; umask(0); state = mknod(file, S_IFIFO | 0600, 0); printf("errno: %d\n", errno); perror("Error"); printf("state %d\n", state); return 0; }
输出
errno: 95 Error: Operation not supported state -1
备注:若将mknod的mode参数替换为0,可创建普通文件,但权限为-r-xr-xr-x(即0555)。
原因分析
- 文件系统不支持FIFO:部分文件系统(如FAT32、部分网络文件系统)不支持命名管道(FIFO)的创建,此时调用
mknod创建FIFO会返回ENOSYS(错误码95),提示操作不支持。 - mknod的设计限制:在多数现代系统中,
mknod被限制为仅用于创建设备文件,创建FIFO更推荐使用POSIX标准的mkfifo函数,兼容性更强。 - mode为0的权限异常:当
mknod的mode参数设为0时,系统会默认创建普通文件,但由于mode值为0,系统可能采用 fallback 权限逻辑,导致最终权限变为0555而非预期的0(即使设置了umask(0))。
解决方案
1. 使用mkfifo替代mknod创建FIFO
mkfifo是专门用于创建命名管道的函数,兼容性更好,修改后的代码如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> int main() { char file[] = "pipe.txt"; int state; umask(0); // 直接用mkfifo创建FIFO,指定权限0600 state = mkfifo(file, 0600); printf("errno: %d\n", errno); perror("Error"); printf("state %d\n", state); return 0; }
2. 确认文件系统兼容性
如果坚持使用mknod,先检查当前目录所在文件系统是否支持FIFO。可以通过以下命令查看文件系统类型:
df -T .
主流本地文件系统(如ext4、XFS)均支持FIFO,若为不支持的文件系统,需切换到支持的分区操作。
3. 正确创建普通文件
若需要创建普通文件,不推荐使用mknod,建议用open函数:
// 创建权限为0600的普通文件 int fd = open(file, O_CREAT | O_RDWR, 0600);
内容的提问来源于stack exchange,提问作者sorceror
相关产品推荐
相关产品推荐

