我正在编写一个功能非常像聊天室的 TCP 服务器,遇到了这个问题。
当用户连接时,会创建一个子进程来为用户服务。
当用户登录时,我将他的用户名存储到一个文本文件 online.txt
但是当用户注销时,我需要从 online.txt
(问题)中删除用户,然后父级 signals
reaper()
并杀死了 child 。
我的问题是:
问题 1:我如何才能向收割者塞入额外信息(例如用户用于登录的用户名),以便它也可以从 online.txt
中删除用户?或者还有其他更好的方法吗?
Q2:reaper()
中的sig
是从哪里获取值的?我可以向收割器添加额外的参数吗?
问题 3:我可以使用 child 的 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?
提前谢谢你,我希望一次问 3 个问题不要太贪心。
对任何问题的任何见解都将不胜感激。
最佳答案
据我从您的问题中收集到的信息,父进程将 reaper() 注册为 SIGCHLD 的处理程序。当它检测到登录时,它会将用户名写入文件,并生成一个 child 。
在注销时调用 reaper() 函数,因为子进程检测到注销并退出,对吧?
如果是这样,为什么不让服务器维护一个将 PID 映射到用户名的数据结构。然后从 waitpid 中获取返回值并确定需要从文件中删除哪个用户名。
总结一下:
1) 否。是。
2) 从处理程序收到的信号。没有。
3) 是的。来自 waitpid() 的返回值。
关于c - 当 parent 收到杀死子进程的信号时,如何向收割者函数中加入额外的参数 (c)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4399801/