当父母被发信号杀死孩子时,如何将其他参数挤入收割者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 ..但是我会质疑你是否真的想用文件做这个。

当您开始在整个地方发出信号时,您的解决方案可能会受到竞争条件的影响……这会给安全带来风险。

同行用户,请随时纠正我。 在寻求智慧时,必须接受指导。