【问题标题】:Reading /proc/<pid>/cmdline in C, getting different results each time在C中读取/proc/<pid>/cmdline,每次得到不同的结果
【发布时间】:2020-09-22 23:56:12
【问题描述】:

我正在尝试读取 /proc//cmdline。

该程序应该打印出 PID,然后是 /proc//cmdline 中的内容。如果文件为空,则应打印 []。

对于我在下面的屏幕截图中测试的过程,它应该打印 [] 因为 cmdline 文件中没有任何内容。相反,如您所见,它正在打印一些奇怪的字符串(每次都不同)。扫描此文件时我做错了什么吗?

FILE* fp;
char buffer[256] = "";
char temp[256];
sprintf(buffer, "/proc/%s/cmdline", processId);
fp = fopen(buffer, "r");
fscanf(fp, "%[^\n]", temp);
printf("[%s] ", temp);
fclose(fp);

【问题讨论】:

  • 初始化数组'char buffer[256] = {0};.
  • cmdline 不以 \n' so the statement; fscanf(fp, "%[^\n]", temp);` 结尾会失败
  • 贴出的代码如何获取processId的内容?
  • 文件中的数据字节:cmdline]结尾因此建议读取数据字节直到遇到]
  • 发布的代码从不将processId 输出为单独的实体

标签: c file-io


【解决方案1】:

processId 应该是pid_t;注意使用%s 而不是%d 的原始发布代码; fopen()fscanf() 的返回值被忽略;打印temp 的输出可能显示未初始化的堆栈数据。示例版本:

#include <stdio.h>
#include <unistd.h>

int
main(void)
{
    FILE *fp;
    char buffer[256], temp[256] = { 0 };
    pid_t processId;
    int ns;

    processId = getpid();
    sprintf(buffer, "/proc/%d/cmdline", processId);
    fp = fopen(buffer, "r");
    if (fp == NULL) {
        fprintf(stderr, "fopen() NULL, \"%s\"\n", buffer);
        return (1);
    }

    // consider what happens if cmdline content is larger than temp
    ns = fscanf(fp, "%[^\n]", temp);
    fclose(fp);
    printf("fscanf() returned %d\n", ns);
    printf("[%s] (%d)\n", temp, processId);

    return (0);
}

【讨论】:

  • 此答案无法限制通过fscanf() 读取的数据量,并且cmdline 中的最后一个字符不是'\n',而是],建议:ns = fscanf(fp, "%255[^]]", temp);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2016-07-31
相关资源
最近更新 更多