mirror of
https://github.com/jarun/nnn.git
synced 2024-11-28 05:41:31 +00:00
Use non-blocking pipes
This commit is contained in:
parent
55d916921f
commit
acdc6dc0a3
22
nnn.c
22
nnn.c
|
@ -1279,25 +1279,38 @@ get_output(char *buf, size_t bytes, char *file,
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int pipefd[2];
|
int pipefd[2];
|
||||||
FILE *pf;
|
FILE *pf;
|
||||||
int status;
|
int tmp, flags;
|
||||||
char *ret = NULL;
|
char *ret = NULL;
|
||||||
|
|
||||||
if (pipe(pipefd) == -1)
|
if (pipe(pipefd) == -1)
|
||||||
printerr(1, "pipe(2)");
|
printerr(1, "pipe(2)");
|
||||||
|
|
||||||
|
for (tmp = 0; tmp < 2; ++tmp) {
|
||||||
|
/* Get previous flags */
|
||||||
|
flags = fcntl(pipefd[tmp], F_GETFL, 0);
|
||||||
|
|
||||||
|
/* Set bit for non-blocking flag */
|
||||||
|
flags |= O_NONBLOCK;
|
||||||
|
|
||||||
|
/* Change flags on fd */
|
||||||
|
fcntl(pipefd[tmp], F_SETFL, flags);
|
||||||
|
}
|
||||||
|
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
/* In child */
|
/* In child */
|
||||||
close(pipefd[0]);
|
close(pipefd[0]);
|
||||||
dup2(pipefd[1], STDOUT_FILENO);
|
dup2(pipefd[1], STDOUT_FILENO);
|
||||||
dup2(pipefd[1], STDERR_FILENO);
|
dup2(pipefd[1], STDERR_FILENO);
|
||||||
|
close(pipefd[1]);
|
||||||
execlp(file, file, arg1, arg2, NULL);
|
execlp(file, file, arg1, arg2, NULL);
|
||||||
_exit(1);
|
_exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In parent */
|
/* In parent */
|
||||||
waitpid(pid, &status, 0);
|
waitpid(pid, &tmp, 0);
|
||||||
close(pipefd[1]);
|
close(pipefd[1]);
|
||||||
|
|
||||||
if (!pager) {
|
if (!pager) {
|
||||||
pf = fdopen(pipefd[0], "r");
|
pf = fdopen(pipefd[0], "r");
|
||||||
if (pf) {
|
if (pf) {
|
||||||
|
@ -1312,13 +1325,14 @@ get_output(char *buf, size_t bytes, char *file,
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
/* Show in pager in child */
|
/* Show in pager in child */
|
||||||
dup2(pipefd[0], STDIN_FILENO);
|
dup2(pipefd[0], STDIN_FILENO);
|
||||||
execlp("less", "less", NULL);
|
|
||||||
close(pipefd[0]);
|
close(pipefd[0]);
|
||||||
|
execlp("less", "less", NULL);
|
||||||
_exit(1);
|
_exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In parent */
|
/* In parent */
|
||||||
waitpid(pid, &status, 0);
|
waitpid(pid, &tmp, 0);
|
||||||
|
close(pipefd[0]);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue