分叉其 child 后是否应该守护进程 parent free() 内存?
Should a daemonising parent free() memory after forking its child?
假设我们有这样的代码:
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;
}
一般来说,我更喜欢在 returning 之前释放内存,因为对性能的影响很小,而且它有助于自动工具检测内存泄漏。也就是说,这里的性能/最佳实践对我来说不太清楚,因为 运行 这些工具在守护进程上毫无意义。这引出了两个问题:
- 在 return 之前释放 parent 进程的内存(例如
*buf
)是否会影响 child 的性能?我认为 copy-on-write 的实施方式可能会有一些(正面或负面)。
- parent 到
free
剩余资源是否被认为是好的做法?
我认为将 thing 的分配限制在它有效的可执行区域是一个很好的做法。对我来说,免费是文档的一部分——这个 thing 不再有效或无法访问。在所有的编程中,简洁产生清晰;明确的方案可以改进和优化;不连贯的不能。
就分叉的性能而言,如果您要测量 page-cache 效果,您可能处在一个非常黑暗的地方。从根本上说,进程的页面将指向相同的底层页面;如果一个人放弃该页面,另一个人将得到它 free-of-charge [如果 refcount == 1,则复制没有意义]。实际上,所发生的只是一些链表节点得到更新,而你无法真正衡量它。
就是说,如果您正在为整个 DVD 或其他东西进行分配,是的,您可以考虑将其映射 共享。
假设我们有这样的代码:
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;
}
一般来说,我更喜欢在 returning 之前释放内存,因为对性能的影响很小,而且它有助于自动工具检测内存泄漏。也就是说,这里的性能/最佳实践对我来说不太清楚,因为 运行 这些工具在守护进程上毫无意义。这引出了两个问题:
- 在 return 之前释放 parent 进程的内存(例如
*buf
)是否会影响 child 的性能?我认为 copy-on-write 的实施方式可能会有一些(正面或负面)。 - parent 到
free
剩余资源是否被认为是好的做法?
我认为将 thing 的分配限制在它有效的可执行区域是一个很好的做法。对我来说,免费是文档的一部分——这个 thing 不再有效或无法访问。在所有的编程中,简洁产生清晰;明确的方案可以改进和优化;不连贯的不能。
就分叉的性能而言,如果您要测量 page-cache 效果,您可能处在一个非常黑暗的地方。从根本上说,进程的页面将指向相同的底层页面;如果一个人放弃该页面,另一个人将得到它 free-of-charge [如果 refcount == 1,则复制没有意义]。实际上,所发生的只是一些链表节点得到更新,而你无法真正衡量它。
就是说,如果您正在为整个 DVD 或其他东西进行分配,是的,您可以考虑将其映射 共享。