我正在尝试使用线程检查c ++中是否存在进程。 我最初测试没有任何线程,并让主要检查存在。 有效。 但突然间,当我将这部分代码放在一个线程中时,它不起作用。 我很困惑地看到它不起作用。 任何人都可以告诉我为什么在线程中使用它时代码部分无效。
我对过程存在的初步测试程序:
编译如下:CC protest2.cc -o nothr
int main(int argc, char **argv)
{
struct stat sts;
string f=string("/proc/")+argv[1];
while(!(stat(f.c_str(), &sts) == -1 && errno == ENOENT))
{
cout<<"process exists"<<endl;
sleep(1);
}
cout<<"process Does not exist"<<endl;
return 0;
}
一个小进程,运行几秒钟然后退出。
int main() {
sleep(5);
for(int i=0;i<5;i++)
{
sleep(2);
}
}
我使用线程存在进程的第二个测试程序(这不起作用):
编译如下:CC protest.cc -o thr
extern "C" void *run(void *str){
struct stat sts;
while(!(stat((char *)str, &sts) == -1 && errno == ENOENT))
{
cout<<"process exists"<<endl;
sleep(1);
}
return NULL;
}
int main(int argc,char **argv)
{
string f=string("/proc/")+argv[1];
pthread_t pid;
int res=pthread_create(&pid,NULL,run,(void *)f.c_str());
pthread_join(pid,NULL);
cout<<f<<endl;
cout<<"process Does not exist"<<endl;
return 0;
}
没有主题时的输出:
> ./a.out &
[1] 10128
> ./nothr 10128
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process Does not exist
[1] + Done ./a.out
>
有线程时输出:
> ./thr 10458
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
process exists
^C
它继续,直到我按CTRL + C.
答案 0 :(得分:1)
非常非常技术上,f.c_str()
的有效生命周期(在您的线程代码示例中)纯粹是在pthread_create
调用的持续时间内。因此,当线程调用stat
时,传递的地址内容已经发生了足够的变化,导致您获得ENOENT
以外的错误。这将使你的测试失败,你将永远循环。
顺便说一句,使用kill(pid, 0)
是一种更便携,更轻量级的方法来测试流程的存在。