如何在其他参数收割机功能挤当父被通知给杀了孩子(C)?(How to squeeze in addi

2019-10-29 18:10发布

我正在写的功能非常像一个聊天室和碰到这个问题就来了一个TCP服务器。

当用户连接,创建一个子进程来为用户服务。
当用户登录时,我自己的用户名存储到一个文本文件, online.txt
但是,当用户注销时,我需要从删除用户online.txt (的问题),父则signals一个reaper()并杀死了孩子。

我的问题是:

Q1:如何我可以在附加信息来收割挤压(如用户使用的登录用户名),因此它也可以删除该用户online.txt ? 还是有另一种更好的方法来做到这一点?

Q2:哪里sigreaper()从获取其值? 我可以添加额外的参数来收割?

Q3:我可以用孩子的PID为某种对的login.txt主键的? 如果是这样,我怎么能检索过程中,孩子的PID reaper()这是由父母叫什么名字?

收割者看起来是这样的:

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个问题,在一次是不是太贪婪。
对任何问题的任何有识之士将不胜感激。

Answer 1:

据我可以从你的问题收集,父进程注册收割机()为SIGCHLD的处理程序。 当它检测到登录,用户名写入文件,并生成一个孩子。

在注销收割机()函数被调用,因为子进程检测注销等退出,对不对?

如果是这样,为什么不直接在服务器维护的数据结构映射到PID用户名。 再从waitpid函数的返回值,并确定该用户名需要被从文件中删除。

所以,概括地说:

1)号是。

2)从由该处理程序接收的信号。 没有。

3)是的。 从waitpid函数的返回值()。



Answer 2:

问题1:请问配置为您的孩子过程中执行一些特定的动作是适当的信号处理? 不过也许是更好的解决办法是不使用的文件,而是一个在存储器结构来存储用户登录的东西。这样的收割者可以直接删除该条目内存不足,甚至提出了信号处理程序。

问题2:我不熟悉你的操作系统或架构,但我猜想,SIGCHLD将用于该参数值传递到收割者(INT SIG)。

问题3:获取pid是特定于操作系统。 对于POSIX类型它通常GETPID(),从unistd。但是我怀疑,如果你真的想要做的是与文件。

您的解决方案可以变得脆弱,当你开始信令所有的地方......这使它的安全风险,竞争条件。

各位用户,欢迎指正。 在寻找智慧,一个必须接受指令。



文章来源: How to squeeze in additional parameters to a reaper function when a parent is signalled to kill a child (c)?