我正在编写一个TCP服务器,它的function非常像聊天室,并且遇到了这个问题。
当用户连接时,将创建子进程以为用户提供服务。
当用户登录时,我将他的用户名存储到文本文件online.txt
但是当用户注销时,我需要从online.txt
(问题)中删除用户,然后父母signals
online.txt
reaper()
并杀死孩子。
我的问题是:
问题1:我如何向收割者挤出额外的信息(例如用户用来登录的用户名),这样它也可以从online.txt
删除用户? 或者还有另一种更好的方法吗?
Q2: reaper()
中的sig
从哪里获得价值? 我可以在收割机上添加其他参数吗?
问题3:我可以将孩子的pid用作login.txt的某种主键吗? 如果是这样,如何在父母调用的reaper()
期间检索孩子的pid?
收割机看起来像这样:
void reaper(int sig)//where does sig come from? { int status; while (waitpid(-1, &status, WNOHANG) >= 0) ; }
父母使用的信号如下所示:
(void) signal(SIGCHLD, reaper);//how can I add more parameters?
提前谢谢,我希望马上问三个问题不是太贪心。
任何有关任何问题的见解将不胜感激。
据我所知,父进程将reaper()注册为SIGCHLD的处理程序。 当它检测到登录时,它会将用户名写入文件,并生成一个子项。
在注销时调用reaper()函数,因为子进程已检测到注销并退出,对吧?
如果是这样,为什么不让服务器维护一个数据结构映射PID到用户名。 然后从waitpid获取返回值,并确定需要从文件中删除哪个用户名。
所以,总结一下:
1)不,是的。
2)从处理程序收到的信号。 没有。
3)是的。 从waitpid()的返回值。
问题1:为您的子进程配置信号处理程序以执行某些特定操作是否合适? 然而,也许更好的解决方案是不使用文件,而不是内存构造来存储用户登录的内容。这样,收割者可以删除内存中的条目,甚至是建议的信号处理程序。
问题2:我不熟悉您的操作系统或体系结构,但我猜想SIGCHLD将传递给reaper(int sig)作为参数值。
问题3:获取pid是特定于os的。 对于POSIX类型,它通常是getpid(),来自unistd ..但是我会质疑你是否真的想用文件做这个。
当您开始在整个地方发出信号时,您的解决方案可能会受到竞争条件的影响……这会给安全带来风险。
同行用户,请随时纠正我。 在寻求智慧时,必须接受指导。
以上就是c/c++开发分享当父母被发信号杀死孩子时,如何将其他参数挤入收割者function?(c)?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522511.html