gpt4 book ai didi

c++ - 使用线程检查c++中是否存在进程

转载 作者:行者123 更新时间:2023-11-28 06:40:56 25 4
gpt4 key购买 nike

我正在尝试使用线程检查 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。

最佳答案

从技术上讲,f.c_str()(在您的线程代码示例中)的有效生命周期纯粹是在 pthread_create 调用期间。因此,有可能在线程调用 stat 时,传递的地址的内容已发生足够大的变化,导致您收到 ENOENT 以外的错误。这将使您的测试失败,并且您将永远循环。

顺便说一句,使用 kill(pid, 0) 是一种更便携、更轻量级的测试进程是否存在的方法。

关于c++ - 使用线程检查c++中是否存在进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25970485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com