Browse Source

Use non-blocking pipes

master
Arun Prakash Jana 7 years ago
parent
commit
acdc6dc0a3
No known key found for this signature in database GPG Key ID: A75979F35C080412
1 changed files with 18 additions and 4 deletions
  1. +18
    -4
      nnn.c

+ 18
- 4
nnn.c View File

@@ -1279,25 +1279,38 @@ get_output(char *buf, size_t bytes, char *file,
pid_t pid;
int pipefd[2];
FILE *pf;
int status;
int tmp, flags;
char *ret = NULL;

if (pipe(pipefd) == -1)
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();
if (pid == 0) {
/* In child */
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);
close(pipefd[1]);
execlp(file, file, arg1, arg2, NULL);
_exit(1);
}

/* In parent */
waitpid(pid, &status, 0);
waitpid(pid, &tmp, 0);
close(pipefd[1]);

if (!pager) {
pf = fdopen(pipefd[0], "r");
if (pf) {
@@ -1312,13 +1325,14 @@ get_output(char *buf, size_t bytes, char *file,
if (pid == 0) {
/* Show in pager in child */
dup2(pipefd[0], STDIN_FILENO);
execlp("less", "less", NULL);
close(pipefd[0]);
execlp("less", "less", NULL);
_exit(1);
}

/* In parent */
waitpid(pid, &status, 0);
waitpid(pid, &tmp, 0);
close(pipefd[0]);

return NULL;
}


Loading…
Cancel
Save