c/fork/signals/关闭不同进程中打开的套接字的最佳实践

标签 c fork signals

大家好,

两天前我在问线程和fork。现在我最终使用了 fork 方法。 创建第二个进程,父进程和子进程执行不同的代码,但都以 while 循环结束,因为一个通过套接字永远发送数据包,而另一个永远在套接字上监听。现在我希望它们在按下 ctrl-c 时进行清理,即两者都应该在返回之前关闭它们打开的套接字。

我有三个文件,第一个是创建进程的主文件。在第二个文件中写入父代码,在第三个文件中写入子代码。您可以在此处找到更多信息(代码片段):c / interrupted system call / fork vs. thread

现在我的问题是,我必须将信号处理程序放在哪里,还是必须指定其中两个,每个进程一个?这似乎是一个简单的问题,但不知何故对我来说不是。我尝试了不同的方法。但是只能让其中一个人在返回之前成功清理(我的英语不好,因此很抱歉)。两者都必须做不同的事情,这就是我的问题,所以一个处理程序是不够的,对吧?

struct sigaction new_action;
new_action.sa_handler = termination_handler_1;
sigemptyset (&new_action.sa_mask);
new_action.sa_flags = 0;
sigaction(SIGINT, &new_action, NULL);

....more code here ... 

/* will run until crtl-c is pressed */
while(keep_going) {
    recvlen = recvfrom(sockfd_in, msg, itsGnMaxSduSize_MIB, 0, (struct sockaddr *) &incoming, &ilen);
    if(recvlen < 0) {
        perror("something went wrong / incoming\n");
        exit(1);
    }

    buflen = strlen(msg);
    sentlen = ath_sendto(sfd, &athinfo, &addrnwh, &nwh,  buflen, msg, &selpv2, &depv);

    if(sentlen == E_ERR) {
        perror("Failed to send network header packet.\n");
        exit(1);
    }
}

close(sockfd_in);
/* Close network header socket */
gnwh_close(sfd);
/* Terminate network header library */
gnwh_term();
printf("pc2wsu: signal received, closed all sockets and so on!\n");
return 0;
}


void termination_handler_1(wuint32 signum) {
    keep_going = 0;
}

如您所见,在我的例子中处理信号只是改变循环条件“keep_going”。退出循环后,每个进程都应该清理。

在此先感谢您的帮助。 尼里基

最佳答案

没有理由关闭套接字。当一个进程退出时(这是 SIGINT 的默认操作),它的所有文件描述符本质上都是关闭的。除非你有其他必要的清理工作要做(比如将数据保存到磁盘),否则根本不要处理信号。这几乎肯定是错误的做法。

关于c/fork/signals/关闭不同进程中打开的套接字的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6056859/

相关文章:

linux - qt creator 在 Linux 信号上停止

c - GtkLevelBar 方向

c - 在 Objective-C 类中混合 C 函数

c - 如何在单维字符指针数组中存储值

c - Unix fork parent id 不一致

c - 如何计算 C 中 fork() 系统调用的运行时间?

c - fork() 期间重复的段?

c++ - 两个进程访问临界区时出错

python - 从线程发送信号时出错

linux - 操作系统什么时候检查信号?