【Linux系统编程】| 【09】/proc文件系统

1、/proc文件系统

UNIX提供了/proc虚拟文件系统,内核信息文件存于/proc文件目录下;
	该目录下的文件和子目录并未存储与磁盘上,由内核在进程访问此类信息时动态创建而成;

1.1 获取与进程有关的信息

【/proc/PID】:PID为进程;
【PID目录下的文件节选】:
	- cmdline:以\0分隔的命令行参数;
	- cwd:指向当前工作目录的符号链接;
	- Environ:NAME=value 键值对环境列表,以\0分隔;
	- exe:指向正在执行文件的符号链接;
	- fd:文件目录,包含了指向由进程打开文件的符号链接;
	- maps:内存映射;
	- mem:进程虚拟内存(在IO操作之前必须调用Iseek(移至有效偏移量);
	- mounts:进程的安装点;
	- root:指向根目录的符号链接;
	- status:各种信息(比如,进程ID、凭证、内存使用量、信号);
	- task:为进程中的每个线程均包含一个子目录;

1.2 /proc目录下的系统信息

/proc:各种系统信息;
/proc/net:有关网络和套接字的状态信息;
/proc/sys/fs:文件系统相关设置;
/proc/sys/kernel:各种常规的内核设置;
/proc/sys/net:网络和套接字的设置;
/proc/sys/vm:内存管理设置;
/proc/sysvipc:有关System V IPC对象的信息;

1.3 访问/proc文件

该目录下的文件,大多为只读,且文件拥有者为root;

2、系统标识

#include <sys/utsname.h>

int uname(struct utsname *utsbuf);
/**
@func: 返回值主机系统的标识信息,存储与utsbuf结构中;
*/

#define _UTSNAME_LENGTH 65
struct utsname {
	char sysname[_UTSNAME_LENGTH];
	char nodename[_UTSNAME_LENGTH];
	char release[_UTSNAME_LENGTH];
	char version[_UTSNAME_LENGTH];
	char mechine[_UTSNAME_LENGTH];
#ifdef _GNU_SOURCE
	char domainname[_UTSNAME_LENGTH];
#endif
};

【eg】: 
#include <iostream>
#include <sys/utsname.h>
#include "../Jxiepc/tlpi_hdr.h"

void test_uname() {
    struct utsname uts;

    if(uname(&uts) == -1) 
        errExit("name");
    cout << "Node name: " << uts.nodename << endl;
    cout << "System name: " << uts.sysname << endl;
    cout << "Release: " << uts.release << endl;
    cout << "Version: " << uts.version << endl;
    cout << "Machine: " << uts.machine << endl;

    cout << "Domain name: " << uts.domainname << endl;
}


int main(int argc, char* argv[])
{
    test_uname();

    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这是一个比较复杂的问题,需要较为深入的Linux系统编程知识。我会尽可能详细地回答你的问题。 首先,我们需要了解一下/proc文件系统。在Linux系统中,/proc是一个虚拟文件系统,它不是真正的文件系统,而是内核在运行时动态生成的一个目录树,它提供了一种访问内核数据结构的机制。通过在/proc目录下访问各种文件和子目录,我们可以获取到各种内核参数的信息。 在C程序中,我们可以使用系统调用open()函数和read()函数来访问/proc文件系统。具体的步骤如下: 1. 打开/proc目录,获取其文件描述符。可以使用以下代码实现: ```c int fd = open("/proc", O_RDONLY); if (fd < 0) { printf("Failed to open /proc\n"); return -1; } ``` 2. 遍历/proc目录下的所有子目录和文件,找到我们需要修改的内核参数所对应的文件。可以使用以下代码实现: ```c struct dirent *dir; while ((dir = readdir(fd)) != NULL) { if (dir->d_type == DT_DIR && strcmp(dir->d_name, ".") != 0 && strcmp(dir->d_name, "..") != 0) { // 进入子目录 char path[256]; snprintf(path, sizeof(path), "/proc/%s", dir->d_name); int sub_fd = open(path, O_RDONLY); if (sub_fd < 0) { printf("Failed to open %s\n", path); continue; } // 在子目录中查找指定的文件 struct dirent *sub_dir; while ((sub_dir = readdir(sub_fd)) != NULL) { if (strcmp(sub_dir->d_name, "desired_file") == 0) { // 找到了文件,进行修改 // ... break; } } close(sub_fd); } } ``` 3. 对找到的文件进行修改。具体的操作取决于我们要修改的参数的类型和格式。假设我们要修改的参数是一个整数,那么可以使用以下代码实现: ```c int new_value = 12345; char buf[256]; snprintf(buf, sizeof(buf), "%d", new_value); int len = strlen(buf); lseek(file_fd, 0, SEEK_SET); write(file_fd, buf, len); ``` 这里的file_fd是我们找到的文件的文件描述符。 4. 关闭文件描述符,释放资源。可以使用以下代码实现: ```c close(fd); ``` 综上所述,这就是一个简单的通过Linux文件系统调用,用户态下访问/proc文件系统,获得内核参数修改可以修改的参数的C程序的实现方法。当然,实际的程序可能会更加复杂,需要根据具体的需求进行适当的修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值