使用pthread on/proc进行分段错误
我正在为特定事件创建一定数量的pthread。每个pthread都会扫描/proc,但过了一段时间,我收到了分段错误。如果有人帮助我,我真的很感激 在pthread函数上循环,在该函数中我得到分段错误使用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
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()