Linux环境编程获取文件或目录限制之pathconf, fpathconf, confstr

本文介绍两种隐藏Mac系统Dock上程序图标的方法。方法一通过右击程序显示包内容,在Contents文件夹中找到Info.plist文件并使用plist编辑器打开,添加Applicationisagent(UIElement)项并设置Boolean值为Yes来实现图标和菜单的隐藏。若想恢复,则将Boolean值改为NO。

在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指向一个目录,则该值适用于整个目录。
_PC_MAX_CANON 格式化输入行的最大长度,其中fd或path必须指向终端。
_PC_MAX_INPUT 输入线的最大长度,其中fd或path必须指向一个端子。
_PC_NAME_MAX 允许进程创建的目录路径或fd中文件名的最大长度。
_PC_PATH_MAX 当path或fd是当前工作目录时,相对路径名的最大长度。
_PC_PIPE_BUF 可以原子写入FIFO管道的最大字节数。对于fpathconf(),fd应该引用管道或FIFO。对于fpathconf(),路径应指向FIFO或directec‐历史;在后一种情况下,返回的值对应于在该目录中创建的FIFO。
_PC_CHOWN_RESTRICTED 如果将chown(2)和fchown(2)用于更改文件的用户ID仅限于具有适当权限的进程,并且将文件的组ID更改为除进程的有效组ID或其补充组ID之一之外的值仅限于具有相应权限的进程时,则返回正值。根据POSIX.1,此变量应始终使用非-1的值定义。
如果fd或path指向一个目录,则返回值适用于该目录中的所有文件。
_PC_NO_TRUNC 如果访问长于_POSIX_NAME_MAX的文件名会产生错误,则返回非零。
_PC_VDISABLE 如果可以禁用特殊字符处理,则返回非零,其中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指向一个目录,则该值适用于整个目录。
_PC_MAX_CANON 格式化输入行的最大长度,其中fd或path必须指向终端。
_PC_MAX_INPUT 输入线的最大长度,其中fd或path必须指向一个端子。
_PC_NAME_MAX 允许进程创建的目录路径或fd中文件名的最大长度。
_PC_PATH_MAX 当path或fd是当前工作目录时,相对路径名的最大长度。
_PC_PIPE_BUF 可以原子写入FIFO管道的最大字节数。对于fpathconf(),fd应该引用管道或FIFO。对于fpathconf(),路径应指向FIFO或directec‐历史;在后一种情况下,返回的值对应于在该目录中创建的FIFO。
_PC_CHOWN_RESTRICTED 如果将chown(2)和fchown(2)用于更改文件的用户ID仅限于具有适当权限的进程,并且将文件的组ID更改为除进程的有效组ID或其补充组ID之一之外的值仅限于具有相应权限的进程时,则返回正值。根据POSIX.1,此变量应始终使用非-1的值定义。
如果fd或path指向一个目录,则返回值适用于该目录中的所有文件。
_PC_NO_TRUNC 如果访问长于_POSIX_NAME_MAX的文件名会产生错误,则返回非零。
_PC_VDISABLE 如果可以禁用特殊字符处理,则返回非零,其中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库的版本
_CS_GNU_LIBPTHREAD_VERSION gnu线程库的版本
_CS_PATH 查询PATH环境变量的标准路径

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;
}

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值