我正在开发一个多线程程序。它能够正确关闭所有线程,但是,最后会出现段错误。通过注释掉我的代码的某些部分,我发现它在处理打开/关闭文件的代码区域中:
char *pid_fname;
FILE *file;
sprintf(pid_fname, "%s%d%s", "/proc/", pid, "/stat");
file = fopen(pid_fname, "r");
/* code */
fclose(file);
我尝试在 gdb 中调试,但是我只在段错误后打印出“where”后才得到这个:
#0 0x2f312f63 in ?? ()
#1 0x74617473 in ?? ()
#2 0xbfaee700 in ?? ()
#3 0xbfaee77c in ?? ()
#4 0x006a7810 in ?? ()
#5 0x00000000 in ?? ()
谁能给我一些关于从这里去哪里的指示?
最佳答案
您没有文件名的后备存储。您已经创建了一个指针,但没有分配空间。这意味着它几乎肯定指向某个您不想写入的地方:-)
假设您知道进程 ID 的最大范围(例如 5 位数字),最简单的解决方法是(自 /proc/
和 /stat 起稍微更改参数
是固定字符串):
char pid_fname[sizeof("/proc/99999/stat")];
sprintf(pid_fname, "/proc/%d/stat", pid);
否则,您将需要根据实际的 pid
值动态分配足够的空间,并在内存不足时进行防御性编码。
由于系统往往有一个固定范围的进程 ID,我会选择固定大小的缓冲区。如果你真的想避免错误同时又不担心动态分配,你可以使用类似的东西:
char pid_fname[sizeof("/proc/99999/stat")];
if ((pid < 0) || (pid > 99999)) {
fprintf (stderr, "WTH? What sort of PID was that (%d)?\n", pid);
exit (1);
}
sprintf(pid_fname, "/proc/%d/stat", pid);
关于c - 打开/关闭文件时出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9356562/