Reading/proc/<;pid>/C中的cmdline,每次获得不同的结果

Reading/proc/<;pid>/C中的cmdline,每次获得不同的结果,c,file-io,C,File Io,我正在尝试读取/proc//cmdline 该程序应该打印出PID,后跟/proc//cmdline中的内容。如果文件为空,则应打印[] 对于我在下面的屏幕截图中测试的流程,它应该打印[],因为cmdline文件中没有任何内容。相反,正如您所看到的,它正在打印一些奇怪的字符串(每次都不同)。扫描这个文件有什么问题吗 FILE* fp; char buffer[256] = ""; char temp[256]; sprintf(buffer, "/proc/%s/c

我正在尝试读取/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);

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);
}
#包括
#包括
int
主(空)
{
文件*fp;
字符缓冲区[256],温度[256]={0};
进程ID;
int-ns;
processId=getpid();
sprintf(缓冲区,“/proc/%d/cmdline”,processId);
fp=fopen(缓冲区,“r”);
如果(fp==NULL){
fprintf(stderr,“fopen()NULL,\%s\“\n”,缓冲区);
申报表(1);
}
/考虑CMDLIN内容大于TEMP时会发生什么情况
ns=fscanf(fp,“%[^\n]”,temp);
fclose(fp);
printf(“fscanf()返回%d\n”,ns);
printf(“[%s](%d)\n”,临时,进程ID);
返回(0);
}

Init数组的字符缓冲区[256]={0};。
cmdline
没有以
\n'结尾,因此语句fscanf(fp,“%[^\n]”,temp);`将失败发布的代码如何获取
processId
的内容?文件中的数据字节:
cmdline
]
结尾,因此建议在遇到
]
之前读取数据字节。发布的代码从不将
processId
作为单独的实体输出此答案无法限制数量通过
fscanf()
读取的数据,以及
cmdline
中的最后一个字符不是“\n”,而是
]
,建议:
ns=fscanf(fp,“%255[^]]”,temp)