c/c++语言开发共享当父母被发信号杀死孩子时,如何将其他参数挤入收割者function?(c)?

我正在编写一个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

      (0)
      上一篇 2020年12月10日
      下一篇 2020年12月10日

      精彩推荐