使用pthread on/proc进行分段错误

使用pthread on/proc进行分段错误,c,linux,segmentation-fault,pthreads,C,Linux,Segmentation Fault,Pthreads,我正在为特定事件创建一定数量的pthread。每个pthread都会扫描/proc,但过了一段时间,我收到了分段错误。如果有人帮助我,我真的很感激 在pthread函数上循环,在该函数中我得到分段错误 while ((topproc_dent = readdir(topproc_dir)) != NULL) { if (topproc_dent->d_name[0] < '0' || topproc_dent->d_name[0] > '9') /* Not a pr

我正在为特定事件创建一定数量的pthread。每个pthread都会扫描/proc,但过了一段时间,我收到了分段错误。如果有人帮助我,我真的很感激

在pthread函数上循环,在该函数中我得到分段错误

while ((topproc_dent = readdir(topproc_dir)) != NULL)
{
  if (topproc_dent->d_name[0] < '0' || topproc_dent->d_name[0] > '9') /* Not a process */
    continue;
  pid = atoi(topproc_dent->d_name);
  /* Dont analize my_self */
  if (pid == my_pid)
    continue;

  snprintf(strPath, sizeof strPath, "%s%jd%s", "/proc/", (intmax_t) pid, "/fd");

  DIR *dp;
  struct dirent *ep;
  printf("%s\n", strPath);
  dp = opendir(strPath);
  if (dp != NULL)
  {
    while (ep = readdir(dp))
    {
      if (strcmp("..", ep->d_name) == 0)
        continue;
      if (strcmp(".", ep->d_name) == 0)
        continue;
      snprintf(strLink, sizeof strPath, "%s%s%s", strPath, "/", ep->d_name);
      printf("%s\n", strLink);
      if ((len = readlink(strLink, buf, sizeof(buf) - 1)) != -1)
        buf[len] = '\0';
      printf("%s\n", buf);
    }
    (void) closedir(dp);
  }
  else
    perror("Couldn't open the directory");
  closedir(dp);
}
while((topproc\u dent=readdir(topproc\u dir))!=NULL)
{
如果(topproc_dent->d_name[0]<'0'| | topproc_dent->d_name[0]>'9')/*不是进程*/
继续;
pid=atoi(topproc\u dent->d\u name);
/*不要分析我自己*/
如果(pid==my_pid)
继续;
snprintf(strPath,strPath的大小,“%s%jd%s”,“/proc/”,(intmax_t)pid,“/fd”);
DIR*dp;
结构方向*ep;
printf(“%s\n”,strPath);
dp=opendir(strPath);
如果(dp!=NULL)
{
while(ep=readdir(dp))
{
如果(strcmp(“…”,ep->d_name)==0)
继续;
如果(strcmp(“.”,ep->d_name)==0)
继续;
snprintf(strLink,strPath的大小,“%s%s%s”,strPath,“/”,ep->d_name);
printf(“%s\n”,strLink);
如果((len=readlink(strLink,buf,sizeof(buf)-1))!=-1)
buf[len]='\0';
printf(“%s\n”,buf);
}
(无效)closedir(dp);
}
其他的
perror(“无法打开目录”);
closedir(dp);
}

你真的需要这么多的空间来编写代码吗?你是
pthread\u join()
还是
pthread\u detach()
还是
pthread\u attr\u setdetachedstate()
?不是否检查
pthread\u create()
是否失败?你知道
readdir()
不是线程安全的吗?@EOF我不知道readdir不是线程安全的,我如何避免这个问题?有什么想法吗?对于另一个函数,我不能使用“pthread_join()”,因为对于每个事件,我需要对“/proc”进行不同的扫描,并且每个线程都不会退出此循环,因此它不能调用“pthread_deatach”,您必须将pthread设置为分离,或者与它们连接,否则它们在退出时不会被清除,可能会阻止进一步的
pthread\u create()
s成功。另外,对于您调用的每个函数,您必须知道它是否是线程安全的,如果不是,则安排适当的同步。对于
readdir()
,有一个线程安全的替代品,
readdir\u r()
。如上所述,是POSIX.1线程安全版本。您也可以改为切换到POSIX.1-2008。(只有在不访问utmp或修改环境或同时使用sigalrm的情况下才是线程安全的——我不建议在多线程程序中使用
glob()
)您真的需要这么多空间来编写代码吗?您是
pthread\u join()
还是
pthread\u detached()
还是
pthread\u attr\u setdetachedstate()
?不是否检查
pthread\u create()
是否失败?你知道
readdir()
不是线程安全的吗?@EOF我不知道readdir不是线程安全的,我如何避免这个问题?有什么想法吗?对于另一个函数,我不能使用“pthread_join()”,因为对于每个事件,我需要对“/proc”进行不同的扫描,并且每个线程都不会退出此循环,因此它不能调用“pthread_deatach”,您必须将pthread设置为分离,或者与它们连接,否则它们在退出时不会被清除,可能会阻止进一步的
pthread\u create()
s成功。另外,对于您调用的每个函数,您必须知道它是否是线程安全的,如果不是,则安排适当的同步。对于
readdir()
,有一个线程安全的替代品,
readdir\u r()
。如上所述,是POSIX.1线程安全版本。您也可以改为切换到POSIX.1-2008。(仅当您不同时访问utmp或修改环境或使用sigalrm时才是线程安全的——我不建议在多线程程序中使用
glob()