gpt4 book ai didi

正确清理信号处理函数

转载 作者:行者123 更新时间:2023-11-30 14:57:51 25 4
gpt4 key购买 nike

我编写了一个程序,它使用fork()函数来创建子进程。它的子进程做了一些工作,但我希望它们在收到来自父进程的 SIGTERM 信号时终止。在退出之前,我还希望它们清理我分配的数组,并通过 FIFO 向父进程发送一些内容。所以我有两种情况。

  1. 数组的全局变量以及 FIFO 的文件描述符,然后通过信号处理函数退出,例如:

    /*global variables*/
    struct whatever ** test;
    int test_size;
    int fd_in, fd_out;

    /*handler*/
    void shutdown(int signo)
    {
    /*free memory for the arrays malloc'd through the program*/
    /*send message with the help of fd_out*/
    /*close fd_in and fd_out*/
    _exit(0);
    }
  2. 声明一个全局 int 标志,当子进程感知到该标志已更改时,它们会清理数组、发送消息并退出。

    /*global variables*/
    int exit_flag=0;

    /*handler*/
    void shutdown(int signo)
    {
    exit_flag=1;
    }

    /*child process*/
    int main()
    {
    /*declare fds and arrays*/
    /*use sigaction and set up handler*/

    while(!exit_flag)
    {
    /*do stuff*/
    }

    /*free memory*/
    /*send message with the help of fd_out*/
    /*close fds*/
    }

我的问题是哪种情况可以带来良好的编码/编程?它们是相同的还是有更好、更正确的方法来做到这一点?

最佳答案

您的第二个实现比第一个实现的错误率要低得多。如果要释放/关闭资源,则必须确保事件进程没有使用这些资源。由于您正在接收异步信号,因此没有好方法可以确定您的进程处于合适的状态来释放这些资源而不会出现竞争条件。

此外,您很可能还需要在其他条件(错误、完成等)下执行这些清理例程,因此如果在处理程序中实现这些例程可能是多余的。

另外一点,最好养成将全局标志声明为 volatile 的习惯,以确保编译器不会将标志优化为常量,从而使您陷入无限的困境。循环。

volatile int exit_flag=0;

关于正确清理信号处理函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com