首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试编译C文件时出错: mkfifo:无法创建fifo 'stderr':不支持操作

在尝试编译C文件时遇到错误信息“mkfifo: 无法创建fifo 'stderr':不支持操作”,这通常意味着操作系统不允许在当前路径下创建命名管道(fifo)。这种情况可能发生在某些文件系统上,特别是那些不支持fifo的文件系统,如FAT32或exFAT。

基础概念

命名管道是一种进程间通信(IPC)机制,它允许两个不相关的进程通过共享的队列传输数据。在Unix-like系统中,可以使用mkfifo命令创建命名管道。

可能的原因

  1. 文件系统限制:某些文件系统,如FAT32或exFAT,不支持创建命名管道。
  2. 权限问题:当前用户可能没有足够的权限在指定路径下创建fifo。
  3. 路径问题:指定的路径不存在或者不可写。

解决方法

  1. 检查文件系统: 确保你正在使用的文件系统支持fifo。例如,NTFS和ext4通常支持fifo。
  2. 更改路径: 尝试将编译过程中的输出重定向到一个不同的路径,确保该路径在支持fifo的文件系统上。
  3. 更改路径: 尝试将编译过程中的输出重定向到一个不同的路径,确保该路径在支持fifo的文件系统上。
  4. 检查权限: 确保当前用户有足够的权限在指定路径下创建fifo。
  5. 检查权限: 确保当前用户有足够的权限在指定路径下创建fifo。
  6. 修改编译脚本: 如果你在使用Makefile或其他构建脚本,确保脚本中没有尝试在不支持fifo的路径上创建fifo。
  7. 修改编译脚本: 如果你在使用Makefile或其他构建脚本,确保脚本中没有尝试在不支持fifo的路径上创建fifo。

示例代码

假设你有一个简单的C程序myprogram.c,你可以尝试以下步骤:

代码语言:txt
复制
// myprogram.c
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

编译命令:

代码语言:txt
复制
gcc -o myprogram myprogram.c

如果遇到fifo创建错误,可以尝试将stderr重定向到一个支持fifo的路径:

代码语言:txt
复制
mkfifo /tmp/stderr
gcc -o myprogram myprogram.c 2>/tmp/stderr

参考链接

通过以上方法,你应该能够解决在编译C文件时遇到的fifo创建错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux内核编程--管道pipe

管道的定义: 管道是一种进程间通信机制,也是Linux操作系统中的一种文件形式。一个进程写入管道的数据可以被另一个进程读取。数据按先进先出顺序处理。Linux有两种形式的管道文件,管道和FIFO。...管道或FIFO都可以使用read/write函数访问,且读写操作都是按顺序发生的,从文件的开头读取并在末尾写入(先进先出机制)。管道或 FIFO 必须同时在读写的两端打开。...管道成功创建返回0 *有些版本的操作系统可以创建全双工管道,使用socketpair函数创建 管道创建的经典场景: 一个进程在它派生一个或多个子进程之前创建一个管道, 然后将管道用于父进程和子进程之间或两个兄弟进程之间的通信...FIFO可以由mkfifo()函数或者mknod函数创建 #include #include int mkfifo(const char *file_path...--mkfifo函数已隐含了 O_CREAT | O_EXCL 创建并打开一个管道只需要调用pipe(), 创建并打开一个FIFO,需要调用mkfifo()后再调用open() 管道在所有相关进程关闭它以后自动消失

3.8K10
  • UNPv2第四章:管道和FIFO

    出错为NULL int pclose ( FILE * stream ); //返回:成功为shell的终止状态,出错为-1 type 参数只能是读或者写中的一种,得到的返回值(标准 I...4.FIFO FIFOmkfifo函数创建 #include #include int mkfifo(const char * pathname,mode_t...Mode参数指定文件权限位 Mkfifo函数已隐含指定O_CREAT|O_EXCL。...也就是说,它要么创建一个新的FIFO,要么返回一个EEXIST错误 管道和FIFO的区别如下: 创建并打开一个管道只需要pipe,创建并打开一个FIFO则需要调用mkfifo再调用open 管道在将它打开着的进程中最后一个关闭它之后自动消失...,FIFO的名字只有通过调用unlink才从文件系统中删除 FIFO需要额外调用的好处是:FIFO文件系统中有一个名字,该名字允许某个进程创建一个FIFO,与它无亲缘关系的另一个进程却打开这个FIFO

    50030

    Linux进程间通信(一) - 管道

    当使用半双工管道,任何关联的进程都必须共享一个相关的祖先进程。因为管道存在于系统内核之中,所以任何不在创建管道的进程的祖先进程之中的进程都将无法寻址它。而在命名管道中却不是这样。 ?...my_fifo: fifo (named pipe) 可以看出,命名管道是一种特殊的文件,可以按照文件的读写方式去操作。...访问命名管道 打开FIFO文件 与打开其他文件一样,FIFO文件也可以使用open调用来打开。注意,mkfifo函数只是创建一个FIFO文件,要使用命名管道还是要调用open将其打开。..., F_OK) == -1) { //管道文件不存在 //创建命名管道 res = mkfifo(fifo_name, 0777)...)); //以只读阻塞方式打开管道文件,注意与fifowrite.c文件中的FIFO同名 pipe_fd = open(fifo_name, open_mode);

    3K70

    Linux进程通信 管道

    通常,一个管道由一个进程创建,在进程调用fork后,这个管道就能在父进程和子进程之间使用了。(FIFO无此局限)。       ...FIFO的使用方法与读写文件类似。先创建FIFO文件,再获取FIFO文件的句柄,然后open、write、read、close。...,非阻塞(O_NONBLOCK)会产生下列影响: (1) 一般情况下(未指定O_NONBLOCK),只读open要阻塞到某个进程为写而打开这个FIFO为止。...但是,若没有进程为读而打开这个FIFO,那么只写open则会返回为-1,将effno设置为ENXIO。 在调用mkfifo,会创建一个fifo文件。其中第一个参数可为绝对路径或者相对路径。...PIPE可称为“匿名管道”,无需命名,在具有亲属关系的进程中使用;FIFO又可称为“有名管道”,在使用过程中,其会在系统中创建FIFO类型文件,从而可通过此文件进行不相关进程间的通信。 通信方式。

    3.1K10

    【Linux】 管道扩展 — 开始使用命名管道

    这段内存会在子进程创建的拷贝一份,所以并不需要名字,只需要通过pipefd[0] pipefd[1]来记录其读写端的文件描述符,然后在父子进程中关闭对应的文件描述符,达到单方向通信的需求!...我们来尝试通信一下: 此时两个不同的进程就可以进行通信!!! 我们在让两个进程保持一直通信的状态,这样读端可以一直获取数据! 当我们突然关闭右侧读端,左边的写端就直接退出来了!...这是因为当读端退出了,操作系统会自动释放写端进程,操作系统不会做无用功(不会在一个没有读取的管道文件了一直写入) 当然这样的通信也就只能用来演示,我们先要通过命名管道来使我们创建的两个毫不相干的进程完成通信工作...成员 管道文件名 const std::string _fifo_path 文件描述符 _fd 默认为-1 操作者类型 _id 1 /2 构造函数 --> 创建管道 CreateNamePipe(...(fifo_path) { int n = mkfifo(_fifo_path.c_str(), 0666); if(n !

    9010

    进程间通讯(二).fifo(1)

    前言 UNIX/Linux 是多任务的操作系统,通过多个进程分别处理不同事务来实现,如果多个进程要进行协同工作或者争用同一个资源,互相之间的通讯就很有必要了 进程间通信,Inter process communication...匿名管道 pipe 只能在两个相关的进程之间使用,而且这两个相关的进程还要有一个共同的创建它们的祖先进程,而通过 FIFO 不相关的进程也能交换数据 在 sys/stat.h 中有关于 mkfifo...abfifo if(-1 == access(rfifo,F_OK)) //如果rfifo不存在,则创建 { if(0 > (mkfifo(rfifo,0600)) && (EEXIST...= errno)) //如果创建rfifo失败,并且出错不是文件已经存在,则提示并返回 { printf("cannot create fifo file %s\n",rfifo);...= errno)) //如果创建wfifo失败,并且出错不是文件已经存在,则提示并返回 { printf("cannot create fifo file %s\n",wfifo)

    57910

    【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现

    命名管道由mkfifo函数创建,打开用open FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。...一、创建命名管道的函数 #include // 返回值:成功返回0,出错返回-1 int mkfifo(const char *pathname, mode_t mode...); pathname指创建出来的管道的路径和管道名,mode指创建出来的管道的权限,这里的权限和文件的权限是一样的。.../fifo.txt" //定义命名管道结构体 class Fifo { private: string _name; // 文件路径加文件名 public: Fifo(const string...&name) : _name(name) { int n = mkfifo(_name.c_str(), MODE); if (n == 0)

    13610

    进程间通讯(四).非亲缘进程间交互信号

    前言 UNIX/Linux 是多任务的操作系统,通过多个进程分别处理不同事务来实现,如果多个进程要进行协同工作或者争用同一个资源,互相之间的通讯就很有必要了 进程间通信,Inter process...if(-1 == access(rfifo,F_OK)) //如果rfifo不存在,则创建 { if(0 > (mkfifo(rfifo,0600)) && (EEXIST !...= errno)) //如果创建rfifo失败,并且出错不是文件已经存在,则提示并返回 { printf("cannot create fifo file %s\n",rfifo);...return res; } } if(-1 == access(wfifo,F_OK)) //同样创建wfifo { if(0 > (mkfifo(wfifo...---- 总结 以下函数可以进行有名管道的创建和信号的控制 signal kill pause mkfifo 通过各方面资料弄懂其参数的意义和返回值的类型,是熟练掌握的基础 原文地址

    99310

    Linux进程间通信(上)之管道、消息队列实践

    值得注意的是,FIFO严格遵循先进后出,和栈的原则一样,对管道以及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。...FIFO比pipe函数打开的时候多了一个打开操作open;如果当时打开操作为读而打开FIFO,若已经有相应进程为写而打开该FIFO,则当前打开操作将返回成功;否则,可能阻塞到有相应进程为写而打开该FIFO...和fifo_read.c分别编译fifo_write和fifo_read两个可执行程序: ?...: 1、没有使用O_NONBLOCK:访问要求无法满足进程将阻塞。...如试图读取空的FIFO,将导致进程阻塞; 2、使用O_NONBLOCK:访问要求无法满足不阻塞,立即出错返回,errno是ENXIO。

    2.3K10

    Linux:进程间通信(一.初识进程间通信、匿名管道与命名管道、共享内存)

    创建命名管道: 命名管道是通过调用mkfifo系统调用来创建的。命名管道在文件系统中以文件的形式存在,但实际上它是一个FIFO(First In First Out)的通信通道。...在C语言中,可以使用mkfifo函数来创建一个命名管道,其原型如下: int mkfifo(const char *pathname, mode_t mode); pathname参数是指定要创建的命名管道的路径和文件名...+文件名 }; #endif//条件编译结束 整体上使用一个条件编译: 在C++头文件中,通常会使用条件编译指令来防止头文件被多次包含,以避免重复定义的问题。...阻塞模式: 在阻塞模式下,当进行I/O操作,如果数据尚未准备好或者操作无法立即完成,程序会被阻塞,也就是暂停执行,直到操作完成或者出现错误为止。...非阻塞模式: 在非阻塞模式下,进行I/O操作,如果操作无法立即完成,程序不会被阻塞,而是立即返回一个错误或者一个特定的状态码,提示当前操作无法立即完成。

    36320

    Shell脚本管道符与重定向

    中 $ls test.sh test1.sh 1>suc.txt 2> err.txt # 2>是将错误输出到文件 $cat suc.txt err.txt test.sh ls: 无法访问test1....#&代表标准输出错误输出,将所有标准输出与错误输出 输入到/dev/null文件或者file.txt文件中....1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建文件,不存在直接创建, 无论左边命令执行是否成功,右边文件都会变为空 2、“>>”操作符,判断右边文件,如果不存在就先创建...模块 mkfifo 使用指定的文件创建FIFO(也称为”命名管道”),它是一种特殊的文件类型,它允许独立的进程通讯(反弹Shell你懂的) 一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作...默认情况下,创建FIFO的模式为0666(‘a+rw’)减去umask中设置的位 #基础语法 mkfifo [options] file #选项 -m mode, --mode=mode:设置创建

    1K00

    Shell脚本管道符与重定向

    中 $ls test.sh test1.sh 1>suc.txt 2> err.txt # 2>是将错误输出到文件 $cat suc.txt err.txt test.sh ls: 无法访问test1....#&代表标准输出错误输出,将所有标准输出与错误输出 输入到/dev/null文件或者file.txt文件中....1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建文件,不存在直接创建, 无论左边命令执行是否成功,右边文件都会变为空 2、“>>”操作符,判断右边文件,如果不存在就先创建...模块 mkfifo 使用指定的文件创建FIFO(也称为”命名管道”),它是一种特殊的文件类型,它允许独立的进程通讯(反弹Shell你懂的) 一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作...默认情况下,创建FIFO的模式为0666(‘a+rw’)减去umask中设置的位 #基础语法 mkfifo [options] file #选项 -m mode, --mode=mode:设置创建

    1.8K42

    进程通信(一)无名管道和有名管道

    注意 :从管道读数据是一次性操作,数据一旦被读走,它就从管道中被抛弃,释放空间以便写更多的数据。管道只能采用半双工通信,即在某一刻只能单向传输。要实现父子进程双方互动,需要定义两个管道。...当程序中调用pipe函数,操作系统会创建内核缓冲区,fd作为传出参数,这样才 可以对内核缓冲区进行操控。...(4)半双工的通信方式 使用场景 (1)没有血缘关系的进程间通信 创建方式 (1)mkfifo 管道名 (2)调用函数 mkfifo 函数原型: int mkfifo(const char *...);//默认是阻塞的 if(fd == -1) { int n = mkfifo("FIFO",0664);//创建管道文件FIFO if(-1 == n) { perror("mkfifo...if(fd < 0) { int n = mkfifo("FIFO",0664); if(-1 == n) { perror("mkfifo"); exit(0); }

    1.5K20

    【Linux进程间通信】深入探索:Linux下的命名管道与System V共享内存

    mode); 匿名管道与命名管道的区别 匿名管道由pipe函数创建并打开 命名管道由mkfifo函数创建,打开用open FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同...,一但这些工作完成之后,它们具有相同的语义 命名管道的打开规则 如果当前打开操作是为读而打开FIFO O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK...enable:立刻返回成功 如果当前打开操作是为写而打开FIFO O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO O_NONBLOCK enable:立刻返回失败,错误码为...) IPC_CREAT | IPC_EXCL:当这两个标志位一起使用时,系统调用将尝试创建一个新的IPC对象。...这种组合通常用于确保创建的IPC对象是唯一的 仅IPC_CREAT:当只使用IPC_CREAT标志位,如果指定的IPC对象不存在,则创建一个新的对象;如果对象已经存在,则返回该对象的标识符。

    17010

    【在Linux世界中追寻伟大的One Piece】命名管道

    如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。 命名管道是一种特殊类型的文件。...1.1 -> 创建一个命名管道 命名管道可以从命令行上创建,命令行方法是使用下面这个命令: $ mkfifo filename 命名管道也可以从程序里创建,相关函数有: int mkfifo...命名管道由mkfifo函数创建,打开用open。 FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。...1.3 -> 命名管道的打开规则 如果当前打开操作是为读而打开FIFO: O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO。...如果当前打开操作是为写而打开FIFO。 O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO。 O_NONBLOCK enable:立刻返回失败,错误码为ENXIO。

    8210

    UNIX IPC

    fifo1 之后双方各关闭一个描述符,实现单向通信,但需要实现双向,可通过两个通道实现。 ? fifo2 如下实现示例 : 父进程创建管道,创建子进程, 父关闭写端,子关闭读端,子写父读。...使用FIFO 前需要通过mkfifo创建, 如果存在可能会报错,可以通过判断错误号errno(==EEXIST)选择忽略,创建FIFO后,就可以像读写文件一样进行操作 需要注意的是,调用open()打开命名管道的进程可能被阻塞...FIFO write 的原子性 假设一个进程打开读, 有两个进程打开同一管道同时尝试写入数据(小于PIPE_BUF 1024 到5120), FIFO 保证两次写入的完整性, 不会出现乱序。...其他具体参数使用可以通过 man 查询, 并且 man 中说明编译链接, 需要加入参数 -lrt man mq_overview 涉及如何查看系统系消息队列。...内存映射文件 通过打开一个文件, 使用函数 mmap映射到地址地址空间,通过操作内存的方式代替文件读写,通过此方式可以实现内存共享(两个进程打开同一个文件进行映射) ?

    1.4K20

    linux系统编程之管道(三):命名管道FIFOmkfifo函数

    命名管道可以从命令行上创建,命令行方法是使用下面这个命令: $ mkfifo filename 命名管道也可以从程序里创建,相关函数有: int mkfifo(const char *filename...命名管道由mkfifo函数创建,打开用open。 FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,这些工作完成之后,它们具有相同的语义。...三、命名管道的打开规则 如果当前打开操作是为读而打开FIFO O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开...FIFO O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO O_NONBLOCK enable:立刻返回失败,错误码为ENXIO 需要注意的是打开的文件描述符默认是阻塞的...函数创建一个命名管道文件tp,将Makefile 的文件都读取到tp文件中。

    3.7K60

    【Linux】进程间通信——命名管道

    见一见管道文件 mkfifo函数 输入 man mkfifo 指令 制作一个 FIFOS ,表示命名管道 ---- mkfifo fifo 制作一个管道 ,并命名为 fifo 文件类型以p开头...,被称为管道文件 ---- 输入 man 3 mkfifo 指令 pathname代表路径,若不带路径只有文件名,默认在当前路径下 mode代表创建权限的模式 ,即创建文件的权限(666、664) 成功返回...创建一个管道文件 创建server.cc文件,使用mkfifo函数创建管道文件 ---- 此时运行可执行程序,即可生成fifo管道文件 ---- 权限变为664 ,可是在comm.hpp中设置的权限为...,只需要创建一次 int n=mkfifo(fifoname.c_str(),mode); if(n!...fifo success"<<endl; //2.让服务端直接开启管道文件 int rfd=open(fifoname.c_str(),O_RDONLY); //第二个参数代表读

    1.9K30
    领券