
我有父母的过程,必须创造less数儿童进程。 我发现最好的方法是使用fork + execl 。 但是父进程需要知道具体孩子的execl是否失败,我不知道如何实现。
int pID = fork(); if (pID < 0) { std::cout << "ERROR on fork." << std::endl; } if (pID == 0) { execl("/my/program/full/path",(char *)NulL); exit(1); } else { if (/*child's process execl fails*/) { std::cout << "it Failed" << std::endl } else { std::cout << "child born" << std::endl } }
我觉得这个想法不好:
int status(0); sleep(100); int res = waitpID(pID,&status,WNOHANG); if (res < 0 && errno == 10) { std::cout << "it Failed" << std::endl } else { std::cout << "child born" << std::endl }
因为希望孩subprocess在100毫秒后死亡是不好的,所以我想知道,只有这样才会发生。
我也认为为这样的检查创buildshared_memory或特殊的pipe道连接是一个对蜜蜂大炮。
如何使用Cython将Python 3编译为C
哪里可以获得设备types常量说明?
如何获得与objdump输出的标签对应的ELF二进制文件中的文件偏移量?
使用c:未定义的OpenJobObject引用进行windows API编程
valIDation是否安装Visual C ++ 2008 SP1可再发行组件包没有在windowsregistry中search?
对此我必须有一个简单的解决scheme,那就是我还没有find。
什么是最好的方法来实现呢?
如何通过makefile包含头文件
涉及`std :: string`的编译会导致windows错误状态
错误应用程序<app_name>,版本<版本号>,错误模块kernel32.dll
如何从windows中的C ++程序执行另一个exe
C ++ WinSock蓝牙连接 – AT命令 – 收到错误
作为一个通用的解决方案,您可以使用sigaction()在父项中注册信号处理程序(SIGUSR1)。
在一个孩子中:取消注册信号处理程序,如果execl()调用失败,则需要将SIGUSR1发送给父项。
在父:每个孩子的PID我们将存储在标准::集。 当所有孩子都被创建后,您只需创建一个单独的线程来跟踪孩子。 在线程函数中,只需调用wait()并从集合中删除pID。 另一种方法来侦听SIGCHLD信号(但它会导致更复杂的解决方案,所以如果产生另一个线程是一个选项,我会使用线程)。
当这个集合是空的,我们已经完成了。
总结以上是内存溢出为你收集整理的在linux中创buildsubprocess并处理可能失败的最佳方法全部内容,希望文章能够帮你解决在linux中创buildsubprocess并处理可能失败的最佳方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)