【问题标题】:Looping through directories in proc遍历proc中的目录
【发布时间】:2012-10-15 05:41:51
【问题描述】:

我有一个循环遍历 proc 文件系统中的目录的函数。然后这个函数 grep 一个进程名来查找它的 PID 并将这个 PID 返回给调用函数。

该功能似乎工作正常,但在打开某些目录(对应于进程)时在一两种情况下会失败。 这就是我正在做的事情。

 dr = readdir(dp); 

循环遍历博士
检查目录和进程名称的 dr 类型
将进程名称与字符串进行比较。

 Return PID in case of a match 
 dr = readdir(dp);
 end loop 



main() {
   DIR *d;
   struct dirent *e;

   e=malloc(sizeof(struct dirent));
   d=opendir("/proc");

   while ((e = readdir(d)) != NULL) {
      printf("%d %s\n", e->d_type, e->d_name);
   }

   closedir(d);
}

【问题讨论】:

  • 当您说“在一两种情况下失败”时,您到底是什么意思?
  • 别忘了现在的 C 期望函数的返回类型,例如 main(),返回类型应该是 int。除非你有一个 C99 或更新的编译器,它应该坚持在 main() 上显式返回 int 类型,否则从 main() 的末尾删除 return(0); 或等效是不安全的; C89 没有给你那个执照。当然,/proc 中的每个“全数字”目录名称都是一个 PID;您无需访问目录中的任何内容即可确定向用户报告的 PID。
  • 我知道这一点,但你的意思不是关注问题的核心。
  • @Chimera:当我在无限循环中运行此程序时,有时会在几个小时后出现错误,即使我尝试 grep 的进程运行正常。

标签: c linux proc


【解决方案1】:

问题可能是目录在您检查里面的文件之前就消失了。这意味着当你去目录列表时正在运行的进程在你去读取它的进程信息时不再运行。这是正常的,您必须在应用程序中处理(最好是静默处理)。

此外,您提供的代码 sn-p 肯定不会执行您上面描述的操作。据推测,您为简单起见对其进行了编辑,但在这样做时,您删除了有关您可能做错了什么的任何线索。

【讨论】:

  • 谢谢.. 我认为这就是正在发生的事情。由于 proc 不断动态变化,因此这是可能的。是的,我提供了一个小代码 sn-p 以保持帖子简单......非常感谢。我认为,错误将不得不静默处理。
猜你喜欢
  • 1970-01-01
  • 2016-01-22
  • 2016-07-24
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多