我正在写一个TCP服务器,它的功能非常像聊天室,我遇到了这个问题。
当用户连接时,会创建子进程来为用户提供服务。
当用户登录时,我将他的用户名存储到一个文本文件online.txt中
但是当一个用户注销时,我需要从online.txt中删除该用户(问题),然后父母signals一个reaper()并杀死孩子。
我的问题是:
Q1:我如何在收割机中添加额外的信息(比如用户用来登录的用户名),这样它也可以从online.txt中删除该用户?或者有其他更好的方法来做到这一点?
Q2:reaper()中的sig从哪里获得它的值?我能给收割机添加额外的参数吗?
Q3:我可以使用孩子的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个问题不会太贪婪。
对任何问题的任何见解都将非常感谢。
发布于 2010-12-09 23:29:56
就我从您的问题中收集到的信息而言,父进程将reaper()注册为SIGCHLD的处理程序。当它检测到登录时,它会将用户名写入文件,并派生一个子级。
在注销时,reaper()函数被调用,因为子进程检测到注销并退出,对吗?
如果是这样,为什么不让服务器维护一个将PID映射到用户名的数据结构。然后从waitpid获取返回值,并确定需要从文件中删除哪个用户名。
所以,总结一下:
1)否是。
2)从处理机接收到的信号。不是的。
3)可以。来自waitpid()的返回值。
发布于 2010-12-09 23:36:48
问题1:为您的子进程配置一个信号处理程序以执行某些特定操作是否合适?然而,也许更好的解决方案是不使用文件,而是使用内存结构来存储用户登录的内容。这样,收割器就可以从内存中删除条目,甚至可以删除建议的信号处理程序。
问题2:我不熟悉您的操作系统或体系结构,但我猜SIGCHLD会被传递到reaper( int sig )中作为参数值。
问题3:获取pid是特定于操作系统的。对于POSIX类型,它通常是getpid(),来自unistd。然而,我会质疑你是否真的想用一个文件来做到这一点。
当你开始到处发信号时,你的解决方案可能会变得容易受到竞争条件的影响……这给自己带来了安全风险。
各位用户,请随时纠正我的错误。在寻找智慧的过程中,一个人必须接受指导。
https://stackoverflow.com/questions/4399801
复制相似问题