问题描述
我正在使用 C 语言编程以获取有关 Ubuntu(Ubuntu 20.04 和 gcc 9.3.0)上的进程和任务的一些信息。
我使用以下代码扫描已知pid的进程的任务目录:
char root_path[20] = "/proc/";
strcat(root_path,name_list[i]->d_name);
strcat(root_path,"/task");
tnum = scandir(root_path,&task_list,filter,alphasort);
其中 name_list[i]->d_name
是进程的 pid,形式为 char*。
然后我使用task_list中的结果来访问那些任务的状态:
char path1[20] = "/proc/";
strcat(path1,task_list[j]->d_name);
strcat(path1,"/status");
FILE *fp = fopen(path1,"r");
这只是简单的代码。我遇到的问题是,虽然大部分任务都可以正常访问,但是存在一些任务id,使得fopen返回空指针fp。我使用 assert 语句来检测。但是当我使用 cat /proc/tid/status
检查文件时,它在那里并且可以正常访问。
我把目录改成/proc/pid/task/tid/status
后,问题依旧。
我想知道为什么我不能访问某个任务文件,它和其他状态文件似乎没有区别。返回空指针的任务的 tid 是固定的,直到我再次编译源代码。
解决方法
char path1[20]
太短了。对于这些字符串,对于最坏情况大小的 PID,您至少需要 char path1[24]
。由于在堆栈数组的末尾运行,您的程序未定义。
一旦它不是未定义的,如果它一直发生,调用 perror(path1)
打印出您尝试访问的路径和错误消息。
提示:sizeof("string")
可以在数组声明中使用,因此您可以编写 char path1[sizeof("/proc/" + 10 + sizeof("/status")]
并让编译器为您进行计数。