Reading/proc/<;pid>/C中的cmdline,每次获得不同的结果
我正在尝试读取/proc//cmdline 该程序应该打印出PID,后跟/proc//cmdline中的内容。如果文件为空,则应打印[] 对于我在下面的屏幕截图中测试的流程,它应该打印[],因为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
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)代码>