C 使用pipe()、fork()和信号处理的程序中的内存和管道/套接字管理

C 使用pipe()、fork()和信号处理的程序中的内存和管道/套接字管理,c,pipe,signals,fork,posix,C,Pipe,Signals,Fork,Posix,使用叉子、管道和信号。h信号处理。STDIN用于快速模拟与网络服务器的套接字连接。伪代码: struct message_t { uint32_t length; uint8_t *data; }; int is_shutdown = 0; void signal_handler(int) { //set is_shutdown if SIGINT } int main() { //initialize pipe(); fork();

使用叉子、管道和信号。h信号处理。STDIN用于快速模拟与网络服务器的套接字连接。伪代码:

struct message_t {
    uint32_t length;
    uint8_t *data;
};

int is_shutdown = 0;

void signal_handler(int) {
    //set is_shutdown if SIGINT
}

int main() {
    //initialize
    pipe();
    fork();

    if (parent) {
        while(!is_shutdown) {
            //0. initialize variables, buffer, message_t
            //1. read string of unknown length from STDIN (or socket) to a buffer
            //2. malloc() message_t and fill it's fields
            //3. write() message_t to pipe
            //4. free() message_t
        }
    }

    if (child) {
        while(!is_shutdown) {
            //0. initialize variables, message_t
            //1. read() message_t: read length, malloc() buffer, read data
            //2. execute command
            //4. free() message_t
        }   
    }

    //close pipe
}
有几件事让我困惑:

我应该关闭信号处理器中的管道吗? 我不完全理解在我将消息发送给家长后,它的内存会发生什么变化。写入后是否应释放缓冲区? 如何处理来自信号处理程序的资源释放。我是否应该将缓冲区和fd实现为全局变量,以便从信号处理程序访问它们 是_关闭标志和进程间通信。父母和孩子不共享is_shutdown,因为他们是同一个变量的副本,更改其中一个变量不会更改另一个变量,我的理解对吗? 对于信号处理程序和main,对is_shutdown的并发访问如何?任何隐藏的细节,比如通过多线程并发? 当一个进程关闭时,另一个进程仍在工作。如果管道发生故障,我将无法通知另一个。我应该希望有一个信号管吗? 我怀疑在父级while循环的每次迭代中调用malloc从性能的角度来看是不明智的。但定义足够大的缓冲区感觉像是一个黑客,如果有一天它不够大会怎么样。我错了吗? 我对C和它的内存和资源管理相当陌生:从基于英特尔的强大服务器/台式机的C++14开发切换到~180MHz ARM嵌入式系统的C开发,所以我可能会担心太多,忘记了一些显而易见的事情

不,你不应该。在信号处理程序中,您应该做的唯一一件事是设置\u shutdown。 写就是复制。写入返回后,可以安全地重用或释放缓冲区。不过,一定要处理短写。 你没有。同样,您在信号处理程序中应该做的唯一一件事是设置\u shutdown。while循环终止后,在父块和子块中进行清理。 是的,每个流程都有一个独立的副本。您还应该知道,在这种设计中,如果您从终端运行程序,然后在其上键入^C,内核将在两个进程上触发SIGINT,因为它们都在同一进程组中。 is_shutdown需要使用volatile sig_atomic_t类型声明,对于这样一个简单的程序,不应该由信号处理程序以外的任何程序写入。此外,信号处理程序不应读取其值,而应仅对其进行设置。根据您没有向我们展示的代码的详细信息,可以在不使用sau RESTART的情况下安装信号处理程序,从而中断阻塞系统调用。 对此,您需要做的唯一一件事是确保通信通道的每一侧都能优雅地处理突然断开的另一端。 如果这是一个最终将成为网络服务器和客户端的模型,那么在开始测试突然断开连接之前,您应该从使用管道改为使用socketpair,因为socketpair FD的行为更像真实的网络套接字。 I/O开销可能比malloc开销大得多。在这个阶段担心malloc开销是过早的优化。
感谢您的回答,它确实会演变成远程控制的物联网设备。int is_shutdown=0;->>易失性信号原子为0。。。首先。。。