c - 打开/关闭文件时出现段错误?

标签 c multithreading file gdb

我正在开发一个多线程程序。它能够正确关闭所有线程,但是,最后会出现段错误。通过注释掉我的代码的某些部分,我发现它在处理打开/关闭文件的代码区域中:

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/

相关文章:

c - 加入多播组调用setsockopt报错 "No such device"

c# - 有助于在 C# 中学习多线程的练习建议

c++ - 我的线程运行不正常,它给出了所有结果,最后不是一个一个地在一起,并且 GUI 在线程运行期间被挂起了吗?

java - 在文本文件中查找字符串的方法。然后让以下行达到一定限度

php - 使用 PHP 获取目录的层次结构

Python 关闭子进程

Posix 正则表达式搜索中的捕获组不正确

c - 为什么清除中断标志会导致 C 中的段错误?

c++ - 不锁定 pthread_cond_timedwait 和 pthread_cond_signal 的互斥量(在 Linux 上)

c# - .NET Socketserver 最大并发连接数和积压的最大值