You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:57:18