ITADN

Deadlock if synchronous subprocess fills pipe

#82Openrongcuid 创建于 2024-02-19
R
rongcuidcommented
If a subprocess outputs large amount of data, it deadlocks both parent and subprocess due to pipe blocking: ```c #include <stdlib.h> #include <stdio.h> #include "subprocess.h" int main() { const char *command_line[] = {"dd", "if=/dev/zero", "bs=1k", "count=65", NULL}; struct subprocess_s process; int result = subprocess_create(command_line, subprocess_option_search_user_path, &process); if (result) { fprintf(stderr, "Failed to create subprocess: %d\n", result); return 1; } int proc_return; result = subprocess_join(&process, &proc_return); if (result) { fprintf(stderr, "Failed to join subprocess\n"); return 1; } printf("Subprocess returned %d\n", proc_return); result = subprocess_destroy(&process); if (result) { fprintf(stderr, "Failed to join subprocess\n"); return 1; } return 0; } ``` Notice that subprocess `dd` writes 65k data to stdout, which is greater than Linux's default pipe buffer size, thus blocking the child. However, since `subprocess_read_stdout` must be used after joining, the parent process cannot progress either, as it can neither drain the pipe nor wait for child to finish.
5 条评论