在Linux系统中,有时需要获取文件或目录的最大长度,最大链接等各种限制。本篇记录Linux环境编程获取文件或目录限制之pathconf, fpathconf, confstr函数的基本使用。
首先查看帮助文档。
1.pathconf获取文件或目录限制
函数名 | pathconf |
相关函数 | fpathconf, confstr |
表头文件 | #include <unistd.h> |
函数定义 | long pathconf(const char *path, int name); |
函数说明 |
pathconf获取文件或目录限制。如最大链接数、最大文件或目录长度等。path是文件路径 参数 name 指定了要查询的限制参数的名称。name 可以是以下几个宏之一: _PC_LINK_MAX 指向文件的最大链接数。如果fd或path指向一个目录,则该值适用于整个目录。 |
返回值 | 成功返回对应的值,失败返回非0,错误码设置在errno里 |
示例:
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <sys/sysinfo.h>
using namespace std;
int main()
{
const char *path = "/home/scott/trunk/command2";
long result = -1;
// 查询链接数的最大值
result = pathconf(path, _PC_LINK_MAX);
if(result == -1) {
perror("pathconf ========== _PC_LINK_MAX");
return 1;
}
else {
printf("最大硬链接数为: %ld\n", result);
}
result = pathconf(path, _PC_MAX_CANON);
if(result == -1) {
perror("pathconf ========== _PC_MAX_CANON");
return 1;
}
else {
printf("_PC_MAX_CANON:%ld\n", result);
}
result = pathconf(path, _PC_MAX_INPUT);
if(result == -1) {
perror("pathconf ========== _PC_MAX_INPUT");
return 1;
}
else {
printf("_PC_MAX_INPUT: %ld\n", result);
}
// 查询最大文件名长度
result = pathconf(path, _PC_NAME_MAX);
if(result == -1) {
perror("pathconf ========== _PC_NAME_MAX");
return 1;
}
else {
printf("最大文件名长度为:%ld\n", result);
}
result = pathconf(path, _PC_PATH_MAX);
if(result == -1) {
perror("pathconf ========== _PC_PATH_MAX");
return 1;
}
else {
printf("_PC_PATH_MAX:%ld\n", result);
}
result = pathconf(path, _PC_PIPE_BUF);
if(result == -1) {
perror("pathconf ========== _PC_PIPE_BUF");
return 1;
}
else {
printf("_PC_PIPE_BUF: %ld\n", result);
}
result = pathconf(path, _PC_CHOWN_RESTRICTED);
if(result == -1) {
perror("pathconf ========== _PC_CHOWN_RESTRICTED");
return 1;
}
else {
printf("_PC_CHOWN_RESTRICTED: %ld\n", result);
}
result = pathconf(path, _PC_NO_TRUNC);
if(result == -1) {
perror("pathconf ========== _PC_NO_TRUNC");
return 1;
}
else {
printf("_PC_NO_TRUNC: %ld\n", result);
}
result = pathconf(path, _PC_VDISABLE);
if(result == -1) {
perror("pathconf ========== _PC_VDISABLE");
return 1;
}
else {
printf("_PC_VDISABLE: %ld\n", result);
}
result = pathconf(path, _PC_NO_TRUNC);
if(result == -1) {
perror("pathconf ========== _PC_NO_TRUNC");
return 1;
}
else {
printf("_PC_NO_TRUNC: %ld\n", result);
}
result = pathconf(path, _PC_VDISABLE);
if(result == -1) {
perror("pathconf ========== _PC_VDISABLE");
return 1;
}
else {
printf("_PC_VDISABLE: %ld\n", result);
}
result = pathconf(path, _PC_SOCK_MAXBUF);
if(result == -1) {
perror("pathconf ========== _PC_SOCK_MAXBUF");
return 1;
}
else {
printf("_PC_SOCK_MAXBUF: %ld\n", result);
}
cout << "Hello Ubuntu1804!" << endl;
return 0;
}
运行结果:
2.fpathconf获取文件或目录限制
函数名 | fpathconf |
相关函数 | pathconf, confstr |
表头文件 | #include <unistd.h> |
函数定义 | long fpathconf(int fd, int name); |
函数说明 |
fpathconf获取文件或目录限制。如最大链接数、最大文件或目录长度等。fd是文件或路径的文件描述符。 参数 name 指定了要查询的限制参数的名称。name 可以是以下几个宏之一: _PC_LINK_MAX 指向文件的最大链接数。如果fd或path指向一个目录,则该值适用于整个目录。 |
返回值 | 成功返回对应的值,失败返回非0,错误码设置在errno里 |
示例:
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
using namespace std;
int main()
{
const char *path = "/home/scott/trunk/command2/chmod_test.txt";
int fd = open(path, O_RDONLY);
long result = -1;
// 查询链接数的最大值
result = fpathconf(fd, _PC_LINK_MAX);
if(result == -1) {
perror("pathconf ========== _PC_LINK_MAX");
return 1;
}
else {
printf("最大硬链接数为: %ld\n", result);
}
result = fpathconf(fd, _PC_MAX_CANON);
if(result == -1) {
perror("pathconf ========== _PC_MAX_CANON");
return 1;
}
else {
printf("_PC_MAX_CANON:%ld\n", result);
}
result = fpathconf(fd, _PC_MAX_INPUT);
if(result == -1) {
perror("pathconf ========== _PC_MAX_INPUT");
return 1;
}
else {
printf("_PC_MAX_INPUT: %ld\n", result);
}
// 查询最大文件名长度
result = fpathconf(fd, _PC_NAME_MAX);
if(result == -1) {
perror("pathconf ========== _PC_NAME_MAX");
return 1;
}
else {
printf("最大文件名长度为:%ld\n", result);
}
result = fpathconf(fd, _PC_PATH_MAX);
if(result == -1) {
perror("pathconf ========== _PC_PATH_MAX");
return 1;
}
else {
printf("_PC_PATH_MAX:%ld\n", result);
}
result = fpathconf(fd, _PC_PIPE_BUF);
if(result == -1) {
perror("pathconf ========== _PC_PIPE_BUF");
return 1;
}
else {
printf("_PC_PIPE_BUF: %ld\n", result);
}
result = fpathconf(fd, _PC_CHOWN_RESTRICTED);
if(result == -1) {
perror("pathconf ========== _PC_CHOWN_RESTRICTED");
return 1;
}
else {
printf("_PC_CHOWN_RESTRICTED: %ld\n", result);
}
result = fpathconf(fd, _PC_NO_TRUNC);
if(result == -1) {
perror("pathconf ========== _PC_NO_TRUNC");
return 1;
}
else {
printf("_PC_NO_TRUNC: %ld\n", result);
}
result = fpathconf(fd, _PC_VDISABLE);
if(result == -1) {
perror("pathconf ========== _PC_VDISABLE");
return 1;
}
else {
printf("_PC_VDISABLE: %ld\n", result);
}
result = fpathconf(fd, _PC_NO_TRUNC);
if(result == -1) {
perror("pathconf ========== _PC_NO_TRUNC");
return 1;
}
else {
printf("_PC_NO_TRUNC: %ld\n", result);
}
result = fpathconf(fd, _PC_VDISABLE);
if(result == -1) {
perror("pathconf ========== _PC_VDISABLE");
return 1;
}
else {
printf("_PC_VDISABLE: %ld\n", result);
}
int pipefd[2];
if (pipe(pipefd) == -1) {
perror("pipe");
return -1;
}
long bufsize = fpathconf(pipefd[0], _PC_PIPE_BUF);
if (bufsize == -1) {
perror("fpathconf=====_PC_PIPE_BUF");
return -1;
}
printf("The pipe buffer size is: %ld bytes\n", bufsize);
close(pipefd[0]);
close(pipefd[1]);
cout << "Hello Ubuntu1804!" << endl;
return 0;
}
运行结果:
3.confstr查询特定的配置字符串信息
函数名 | confstr |
相关函数 | fpathconf, pathconf |
表头文件 | #include <unistd.h> |
函数定义 | size_t confstr(int name, char *buf, size_t len); |
函数说明 |
confstr查询特定的配置字符串信息。 参数 name 指定了要查询的限制参数的名称。name 可以是以下几个宏之一: _CS_GNU_LIBC_VERSION gnu库的版本 buf:存放查询的值, len: buf缓冲区的长度。 |
返回值 | 成功返回对应的值,失败返回非0,错误码设置在errno里 |
示例:
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
using namespace std;
int main()
{
char buf[256]; // 缓冲区用于存储返回的字符串
size_t size = sizeof(buf);
// 查询 glibc 的版本号
if(confstr(_CS_GNU_LIBC_VERSION, buf, size) != 0) {
printf("GNU C Library version: %s\n", buf);
}
else {
perror("Error calling confstr");
}
// 查询 glibc thread的版本号
if(confstr(_CS_GNU_LIBPTHREAD_VERSION, buf, size) != 0) {
printf("GNU C Library Thread version: %s\n", buf);
}
else {
perror("Error calling confstr");
}
// 查询 PATH 环境变量的标准路径
if(confstr(_CS_PATH, buf, size) != 0) {
printf("Standard PATH configuration: %s\n", buf);
}
else {
perror("Error calling confstr");
}
cout << "Hello Ubuntu1804!" << endl;
return 0;
}
运行结果: