-
-
Notifications
You must be signed in to change notification settings - Fork 106
Open
Description
If a subprocess outputs large amount of data, it deadlocks both parent and subprocess due to pipe blocking:
#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.
Metadata
Metadata
Assignees
Labels
No labels