Created
June 29, 2017 06:26
-
-
Save zhangyuchi/cce2537753e5063cb2b3bf8ee1dc28ea to your computer and use it in GitHub Desktop.
fork子进程执行cmd,用管道交互
From https://stackoverflow.com/questions/15058876/how-to-capture-the-exit-code-and-stderr-of-the-command-that-is-run-in-c
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <unistd.h> | |
#include <stdio.h> | |
/* since pipes are unidirectional, we need two pipes. | |
one for data to flow from parent's stdout to child's | |
stdin and the other for child's stdout to flow to | |
parent's stdin */ | |
#define NUM_PIPES 2 | |
#define PARENT_WRITE_PIPE 0 | |
#define PARENT_READ_PIPE 1 | |
int pipes[NUM_PIPES][2]; | |
/* always in a pipe[], pipe[0] is for read and | |
pipe[1] is for write */ | |
#define READ_FD 0 | |
#define WRITE_FD 1 | |
#define PARENT_READ_FD ( pipes[PARENT_READ_PIPE][READ_FD] ) | |
#define PARENT_WRITE_FD ( pipes[PARENT_WRITE_PIPE][WRITE_FD] ) | |
#define CHILD_READ_FD ( pipes[PARENT_WRITE_PIPE][READ_FD] ) | |
#define CHILD_WRITE_FD ( pipes[PARENT_READ_PIPE][WRITE_FD] ) | |
void | |
main() | |
{ | |
int outfd[2]; | |
int infd[2]; | |
// pipes for parent to write and read | |
pipe(pipes[PARENT_READ_PIPE]); | |
pipe(pipes[PARENT_WRITE_PIPE]); | |
if(!fork()) { | |
char *argv[]={ "/usr/bin/bc", "-q", 0}; | |
dup2(CHILD_READ_FD, STDIN_FILENO); | |
dup2(CHILD_WRITE_FD, STDOUT_FILENO); | |
/* Close fds not required by child. Also, we don't | |
want the exec'ed program to know these existed */ | |
close(CHILD_READ_FD); | |
close(CHILD_WRITE_FD); | |
close(PARENT_READ_FD); | |
close(PARENT_WRITE_FD); | |
execv(argv[0], argv); | |
} else { | |
char buffer[100]; | |
int count; | |
/* close fds not required by parent */ | |
close(CHILD_READ_FD); | |
close(CHILD_WRITE_FD); | |
// Write to child’s stdin | |
write(PARENT_WRITE_FD, "2^32\n", 5); | |
// Read from child’s stdout | |
count = read(PARENT_READ_FD, buffer, sizeof(buffer)-1); | |
if (count >= 0) { | |
buffer[count] = 0; | |
printf("%s", buffer); | |
} else { | |
printf("IO Error\n"); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
输入:write(PARENT_WRITE_FD, "2^32\n", 5); 要带回车!!!