首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当父母被通知杀死一个孩子时,如何在收割机函数中加入额外的参数(c)?

当父母被通知杀死一个孩子时,如何在收割机函数中加入额外的参数(c)?
EN

Stack Overflow用户
提问于 2010-12-09 23:20:50
回答 2查看 335关注 0票数 0

我正在写一个TCP服务器,它的功能非常像聊天室,我遇到了这个问题。

当用户连接时,会创建子进程来为用户提供服务。

当用户登录时,我将他的用户名存储到一个文本文件online.txt

但是当一个用户注销时,我需要从online.txt中删除该用户(问题),然后父母signals一个reaper()并杀死孩子。

我的问题是:

Q1:我如何在收割机中添加额外的信息(比如用户用来登录的用户名),这样它也可以从online.txt中删除该用户?或者有其他更好的方法来做到这一点?

Q2:reaper()中的sig从哪里获得它的值?我能给收割机添加额外的参数吗?

Q3:我可以使用孩子的pid作为login.txt的某种主键吗?如果是这样,我如何在reaper()期间检索子进程的pid,该进程由父进程调用?

收割机看起来像这样:

代码语言:javascript
复制
void    reaper(int sig)//where does sig come from?
{
int status;

while (waitpid(-1, &status, WNOHANG) >= 0)
    ;
}

父级使用的信号如下所示:

代码语言:javascript
复制
(void) signal(SIGCHLD, reaper);//how can I add more parameters?

提前谢谢你,我希望一次问3个问题不会太贪婪。

对任何问题的任何见解都将非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-09 23:29:56

就我从您的问题中收集到的信息而言,父进程将reaper()注册为SIGCHLD的处理程序。当它检测到登录时,它会将用户名写入文件,并派生一个子级。

在注销时,reaper()函数被调用,因为子进程检测到注销并退出,对吗?

如果是这样,为什么不让服务器维护一个将PID映射到用户名的数据结构。然后从waitpid获取返回值,并确定需要从文件中删除哪个用户名。

所以,总结一下:

1)否是。

2)从处理机接收到的信号。不是的。

3)可以。来自waitpid()的返回值。

票数 2
EN

Stack Overflow用户

发布于 2010-12-09 23:36:48

问题1:为您的子进程配置一个信号处理程序以执行某些特定操作是否合适?然而,也许更好的解决方案是不使用文件,而是使用内存结构来存储用户登录的内容。这样,收割器就可以从内存中删除条目,甚至可以删除建议的信号处理程序。

问题2:我不熟悉您的操作系统或体系结构,但我猜SIGCHLD会被传递到reaper( int sig )中作为参数值。

问题3:获取pid是特定于操作系统的。对于POSIX类型,它通常是getpid(),来自unistd。然而,我会质疑你是否真的想用一个文件来做到这一点。

当你开始到处发信号时,你的解决方案可能会变得容易受到竞争条件的影响……这给自己带来了安全风险。

各位用户,请随时纠正我的错误。在寻找智慧的过程中,一个人必须接受指导。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4399801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档