守护进程的父进程应在分叉其子进程之后释放free()内存吗?

时间:2019-05-28 23:33:43

标签: c fork posix daemon

假设我们有这样的代码:

int main() {
    FILE *f_conf = fopen("conf.conf");
    /* File Open Error Handling */

    char *buf = malloc(128);
    /* Malloc Error Handling */

    fgets(buf, 128, f_conf);
    fclose(f_conf);

    pid_t pid = fork()
    /* Fork Error Handling */

    if (pid) {
        free(buf); /* Should this free be called? */
        return 0;
    }

    while (1) {
        /* Do Stuff */
    }

    return 0;
}

通常,我更喜欢在返回内存之前先释放内存,因为对冲击性能的影响最小,并且它有助于自动工具检测内存泄漏。就是说,我不太清楚性能/最佳实践,因为在守护程序上运行这些工具没有多大意义。这使我想到两个问题:

  1. 返回之前释放父进程的内存(例如*buf)会影响子进程的性能吗?我认为通过写时复制的方式可能会有一些(正面或负面)。
  2. 父母free剩余资源是否被认为是一种好习惯?

1 个答案:

答案 0 :(得分:1)

我认为将事物的分配限制为恰好对它有效的可执行区域是一种很好的做法。对我来说,免费是文档的一部分-此东西不再有效或不可访问。在所有编程中,简洁带来清晰;清晰的程序可以得到改进和优化;不连贯的人不能。

就分叉的性能而言,如果您无法衡量页面缓存效果,则可能处于非常黑暗的环境中。从根本上讲,流程的页面将指向相同的基础页面;如果一个放弃该页面,则另一个放弃该页面[如果refcount == 1,则复制没有意义。实际上,只发生了一些链表节点更新,而您无法真正衡量它的情况。

也就是说,如果您要分配整个DVD或其他内容,是的,您可以考虑将其映射为共享