进程通信pipe, 输入输出,进程间互相读写

来源:互联网 发布:王侯将相宁有种乎影响 编辑:程序博客网 时间:2024/05/16 11:55
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <errno.h>#define MAXLINE80void *parent_read_proc(void *p){int p_fd_r = (int)p;char line[MAXLINE] = {0};int len = 0;int n = 0;while(1){memset(line,0,MAXLINE);len = read(p_fd_r,line,MAXLINE);printf("\nparent read:%s %d\t\n",line,n);n++;}return 0;}void *child_read_proc(void *p){int c_fd_r = (int)p;char line[MAXLINE] = {0};int len = 0;int n = 0;while(1){memset(line,0,MAXLINE);len = read(c_fd_r,line,MAXLINE);printf("\nchild read:%s %d\t\n",line,n);n++;}return 0;}void *parent_write_proc(void *p){int p_fd_w = (int)p;char line[MAXLINE] = {0};int len = 0;int n = 0;char msg[] = "this is parent";while (n < 10) {len = strlen(msg);int err = write(p_fd_w,msg,len);if (err != -1) {printf("\nparent write : %s %d",msg,n);}n++;sleep(2);}return 0;}void *child_write_proc(void *p){int c_fd_w = (int)p;char line[MAXLINE] = {0};int len = 0;int n = 0;char msg[] = "this is child";while (n < 10) {len = strlen(msg);int err = write(c_fd_w,msg,len);if (err != -1) {printf("\nchild write : %s %d",msg,n);}n++;sleep(2);}}int main(void){int fd_rw[2];int fd_wr[2];pid_t pid;pthread_t p_r_pid;/*parent read thread*/pthread_t c_r_pid;/*child read thread*/pthread_t p_w_pid;/*parent write thread*/pthread_t c_w_pid;/*child write thread*/if (pipe(fd_rw) < 0) {printf("create pipe_rw fail!\n");return -1;}if (pipe(fd_wr) < 0) {printf("create pipe_wr fail!\n");}pid = fork();if (pid < 0){printf("fork process fail! errno = %d\n",errno);return -1;}else if (pid == 0) {int err = pthread_create(&c_r_pid,NULL,child_read_proc,(void*)fd_rw[0]);if (err != 0){printf("create child read proc fail, errno = %d\n",err);return -1;}err = pthread_create(&c_w_pid,NULL,child_write_proc,(void*)fd_wr[1]);if (err != 0) {printf("create child write proc fail, errno = %d\n",err);return -1;}pthread_join(c_r_pid);pthread_join(c_w_pid);}else {int err = pthread_create(&p_r_pid, NULL, parent_read_proc,(void*)fd_wr[0]);if (err != 0){printf("create parent read proc fail, errno = %d\n",err);return -1;}err = pthread_create(&p_w_pid, NULL, parent_write_proc,(void*)fd_rw[1]);if (err != 0) {printf("create parent write proc fail, errno = %d\n",err);return -1;}pthread_join(p_r_pid);pthread_join(p_w_pid);}int n = 0;scanf("%d",&n);return 0;}


原创粉丝点击