先说说管道,如果做全双工通信需要开两个管道。 #include <stdio.h> #include <unistd.h> #define BUFSIZE 256 int main(void) { pid_t pid; int fd[2], fd1[2]; char buf[BUFSIZE]; int n; if (pipe(fd) < 0 || pipe(fd1) < 0) { printf("pipe error"); return 0; } if ((pid = fork()) < 0) { printf("fork error"); return 0; } else if (pid > 0) { /*parent*/ close(fd[1]); close(fd1[0]); write(fd1[1], "parent/n", 7); n = read(fd[0], buf, BUFSIZE); write(STDOUT_FILENO, buf, n); } else if (pid == 0) { /*child*/ close(fd[0]); close(fd1[1]); write(fd[1], "children/n", 9); n = read(fd1[0], buf, BUFSIZE); write(STDOUT_FILENO, buf, n); } return 0; } 再来试试popen #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> int main() { close(2); FILE *stream = popen("curl http://www.baidu.com", "r"); size_t l, rlen = 0, len = 256; char *rbuf = malloc(len); assert(rbuf); memset(rbuf, 0, 256); while ((l = fread(rbuf + rlen, 1, 256, stream)) == 256) { rlen += l; len += 256; rbuf = realloc(rbuf, len); assert(rbuf); memset(rbuf + len - 256, 0, 256); } printf("%s/n", rbuf); return 0; } 共享内存的方式, 先试试mmap #include <stdio.h> #include <sys/mman.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void die(char *msg) { printf(msg); exit(0); } int main(void) { int fd; void *area; pid_t pid; if ((fd = open("/dev/zero", O_RDWR)) < 0 ) { die("open error"); } if ((area = mmap(0, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) { die("mmap error"); } if ((pid = fork()) < 0) { die("fork error"); } else if (pid > 0) { printf("parent:%d/n", *(int *)area); wait(NULL); printf("parent:%d/n", *(int *)area); } else if (pid == 0) { printf("child:%d/n", *(int *)area); *(int *)area = 2; } return 0; } 使用shm系列共享内存 #include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> #define SHMAT_FAILED (void *)(-1) void die(char *msg) { printf(msg); exit(0); } int main(void) { int shmid; void *area; pid_t pid; if ((shmid = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | IPC_EXCL)) < 0) { die("shmget error"); } printf("shmid:%d/n", shmid); if ((area = (void *)shmat(shmid, 0, 0)) == SHMAT_FAILED) { die("shmat error"); } *(int *)area = 0; if ((pid = fork()) < 0) { die("fork error"); } else if (pid > 0) { printf("parent:%d/n", *(int *)area); wait(NULL); printf("parent:%d/n", *(int *)area); } else if (pid == 0) { printf("child:%d/n", *(int *)area); *(int *)area = 2; } return 0; }