微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么当我尝试访问任务的状态文件时它返回一个空指针?

如何解决为什么当我尝试访问任务的状态文件时它返回一个空指针?

我正在使用 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")] 并让编译器为您进行计数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。