c - 当 parent 收到杀死子进程的信号时,如何向收割者函数中加入额外的参数 (c)?

标签 c parent-child pid tcpserver process-reaper

我正在编写一个功能非常像聊天室的 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/

相关文章:

mysql - .PID 文件在运行 mysql.server start 时被删除

c - 从 C 到 Swift 的函数回调

c - 从 2D 函数制作 3D perlin 噪声函数

c - 如何修改已传递给 C 函数的指针?

java - 如何将 Maven 依赖项从父级继承到另一个父级?

c - C中父进程退出时杀死子进程

bash - 防止 SIGINT 在 bash 脚本中关闭子进程

signal-processing - PID 上的卡尔曼滤波器

cocoa - NSRunningApplication 无法识别 Window Server 的 PID?

c - TCP 客户端对于特定图像 (.bmp) 失败