C - 很好的终止方式

时间:2015-01-06 00:24:14

标签: c client-server parent-child infinite-loop exit

有无限循环的好方法吗? (我尝试捕捉一个SIGINT,但它不会让我在退出前清理)

我正在做客户端服务器。 每次客户端连接时,服务器都会向客户端分叉并指定一个子节点(这个子节点会将stdin和stdout重定向到fifo或socket的fd然后执行) 在服务器中,我正在无限循环地监听客户端

for(;;)
{
    listen_client();
    create_child();
}

(或多或少) 应用程序正常工作(每个客户端可以与其指定的子服务器完美通信)。 问题出现在服务器关闭上。

我想知道服务器关闭是否有一个很好的方法(我不习惯使用无限循环,不确定它是否正确,并且不确定是否有好的方法)。

我尝试了一个sig_handler(sigaction),但我似乎无法使其工作(理想情况下,我会关闭所有fd,杀死所有孩子并在退出前删除所有的fifos)。

修改

使用跟踪子项的全局变量和sig_handler()中的修改它似乎正在工作,仍然不确定它是一个很好的方式

(sig处理程序中的代码)

while(childs > 0)
{
    pid = wait(NULL);
    //cleanup mess of child
    childs--
}

我的怀疑是: 孩子们总是自动死亡吗?或者我应该发送一个杀戮或什么(在这种情况下,我猜我需要跟踪每个pid)。 是否存在制造僵尸的风险? 是否存在进入无限循环的风险? (我从不减少除了这里以外的“孩子”,我不确定等待是否还要计算孩子们很久以前就死了。)

我知道这“有效”,但我宁愿学会以“正确”的方式去做(如果有这样的话)

1 个答案:

答案 0 :(得分:0)

您可以禁用异步信号生成,在其上创建signalfd(2)和poll(2)。这样您就可以正确处理所有信号,并保持线性程序流程,包括正确的清理。 IMO这是一个非常方便的解决方案。