使用F_GETPIPE_SZ获取管道大小时gcc报未声明错误如何解决
错误原因
F_GETPIPE_SZ 是 Linux 内核特有的 fcntl 操作常量,默认 glibc 不会暴露该定义,需要显式开启 Linux 特有的特性宏才会加载该常量的声明。
解决方法
方法1:开启GNU特性宏(推荐)
两种开启方式二选一即可:
- 方式1:在所有头文件引入的最顶部添加宏定义
#define _GNU_SOURCE // 下面再放置所有头文件引入语句 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/wait.h>
- 方式2:编译时通过gcc参数直接传入宏定义
gcc 你的代码文件名.c -o 输出程序名 -D_GNU_SOURCE
方法2:手动定义常量(临时兼容用)
如果不想开启全量GNU扩展,可以手动补充F_GETPIPE_SZ的定义,放在调用fcntl的代码之前即可:
#ifndef F_GETPIPE_SZ // Linux平台下F_GETPIPE_SZ的固定值为1032 #define F_GETPIPE_SZ 1032 #endif
注意该方式仅适用于Linux平台,跨平台场景下不推荐使用。
验证
修改完成后重新编译,即可消除F_GETPIPE_SZ未声明的报错,运行程序即可正常输出管道的大小,Linux默认管道大小通常为65536字节。
内容的提问来源于stack exchange,提问作者zexed640
相关产品推荐
相关产品推荐

