Use waitpid on compress to avoid defunct processes
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 3s
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 3s
This commit is contained in:
parent
fe04dc7018
commit
af235ff878
2 changed files with 10 additions and 5 deletions
|
@ -29,6 +29,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <spawn.h>
|
#include <spawn.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -123,6 +124,7 @@ int write_files_fn(void *data, void *ud) {
|
||||||
|
|
||||||
int pipe_into_cmd[2];
|
int pipe_into_cmd[2];
|
||||||
int pipe_outof_cmd[2];
|
int pipe_outof_cmd[2];
|
||||||
|
pid_t compressor_pid;
|
||||||
|
|
||||||
if (pipe(pipe_into_cmd) != 0) {
|
if (pipe(pipe_into_cmd) != 0) {
|
||||||
// Unable to create pipes.
|
// Unable to create pipes.
|
||||||
|
@ -147,7 +149,8 @@ int write_files_fn(void *data, void *ud) {
|
||||||
close(pipe_outof_cmd[1]);
|
close(pipe_outof_cmd[1]);
|
||||||
return 1;
|
return 1;
|
||||||
} else if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
|
} else if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
|
||||||
state->parsed->compressor) != 0) {
|
state->parsed->compressor,
|
||||||
|
&compressor_pid) != 0) {
|
||||||
// Failed to spawn compressor.
|
// Failed to spawn compressor.
|
||||||
close(pipe_into_cmd[1]);
|
close(pipe_into_cmd[1]);
|
||||||
close(pipe_outof_cmd[0]);
|
close(pipe_outof_cmd[0]);
|
||||||
|
@ -231,6 +234,8 @@ int write_files_fn(void *data, void *ud) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
waitpid(compressor_pid, NULL, 0);
|
||||||
|
|
||||||
uint16_t u16;
|
uint16_t u16;
|
||||||
uint64_t u64;
|
uint64_t u64;
|
||||||
|
|
||||||
|
@ -705,7 +710,7 @@ int simple_archiver_print_archive_info(FILE *in_f) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int simple_archiver_de_compress(int pipe_fd_in[2], int pipe_fd_out[2],
|
int simple_archiver_de_compress(int pipe_fd_in[2], int pipe_fd_out[2],
|
||||||
const char *cmd) {
|
const char *cmd, void *pid_out) {
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
||||||
|
@ -745,8 +750,8 @@ int simple_archiver_de_compress(int pipe_fd_in[2], int pipe_fd_out[2],
|
||||||
simple_archiver_helper_cmd_string_argv_free_ptr))) char **cmd_argv =
|
simple_archiver_helper_cmd_string_argv_free_ptr))) char **cmd_argv =
|
||||||
simple_archiver_helper_cmd_string_to_argv(cmd);
|
simple_archiver_helper_cmd_string_to_argv(cmd);
|
||||||
|
|
||||||
pid_t spawned_pid;
|
pid_t *pid_t_out = pid_out;
|
||||||
if (posix_spawnp(&spawned_pid, cmd_argv[0], &file_actions, NULL, cmd_argv,
|
if (posix_spawnp(pid_t_out, cmd_argv[0], &file_actions, NULL, cmd_argv,
|
||||||
NULL) != 0) {
|
NULL) != 0) {
|
||||||
close(pipe_fd_in[0]);
|
close(pipe_fd_in[0]);
|
||||||
close(pipe_fd_out[1]);
|
close(pipe_fd_out[1]);
|
||||||
|
|
|
@ -57,6 +57,6 @@ int simple_archiver_print_archive_info(FILE *in_f);
|
||||||
|
|
||||||
/// Returns zero on success.
|
/// Returns zero on success.
|
||||||
int simple_archiver_de_compress(int pipe_fd_in[2], int pipe_fd_out[2],
|
int simple_archiver_de_compress(int pipe_fd_in[2], int pipe_fd_out[2],
|
||||||
const char *cmd);
|
const char *cmd, void *pid_out);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue