当父母被发信号杀死孩子时,如何将其他参数挤入收割者功能?(c)?

我正在编写一个TCP服务器,其功能与聊天室非常相似,并且遇到了这个问题。 当用户连接时,将创建子进程以为用户提供服务。 当用户登录时,我将他的用户名存储到文本文件
online.txt
中 但是当用户退出时,我需要将用户从
online.txt
(问题),父母然后
signals
a
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 ..但是我会怀疑你是否真的想要用文件来做。 当您开始在整个地方发出信号时,您的解决方案可能会受到竞争条件的影响......这会给安全带来风险。 同行用户,请随时纠正我。在寻求智慧时,必须接受指导。     

要回复问题请先登录注册