linux pipe

//gcc -o demo demo.c

//管道实例
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    int pipe_fd[2];
    pid_t pid;
    char r_buf[100];
    char w_buf[4];
    char* p_wbuf;
    int r_num;
    int cmd;
    memset(r_buf,0,sizeof(r_buf));
    memset(w_buf,0,sizeof(r_buf));
    p_wbuf=w_buf;
    if(pipe(pipe_fd)<0){
        printf("pipe create error ");
        return -1;
    }
    pid=fork();
    if(pid==0){
        printf("son fork pid:%d\n", pid);
        close(pipe_fd[1]);
        sleep(3);//确保父进程关闭写端
        r_num=read(pipe_fd[0],r_buf,100);
        printf( "read num is %d the data read from the pipe is %d \n",r_num,atoi(r_buf));
        close(pipe_fd[0]);
        exit(1);
    }
    else if(pid>0){
         printf("father fork pid:%d\n", pid);
        close(pipe_fd[0]);//read
        strcpy(w_buf,"111");
        if(write(pipe_fd[1],w_buf,4)!=-1)
        printf("parent write over \n");
        close(pipe_fd[1]);//write
        printf("parent close fd[1] over \n");
        sleep(10);
    }
    return 0;
}




int main(){
    int pipe_fd[2];
    pid_t pid;
    char r_buf[4096];
    char w_buf[4096*2];
    int writenum;
    int rnum;
    memset(r_buf,0,sizeof(r_buf));
    if(pipe(pipe_fd)<0){
        printf("pipe create error \n");
        return -1;
    }
    if((pid=fork())==0){
        close(pipe_fd[1]);
        while(1){
            sleep(1);
            rnum=read(pipe_fd[0],r_buf,5000);
            printf("child: readnum is %d \n",rnum);
        }
        close(pipe_fd[0]);
        exit(1);
    }
    else if(pid>0){
        close(pipe_fd[0]);
        memset(r_buf,0,sizeof(r_buf));
        if((writenum=write(pipe_fd[1],w_buf,5000))==-1){
            printf("write to pipe error \n");
        }
        else{
            printf("the bytes write to pipe is %d \n", writenum);
        }
        writenum=write(pipe_fd[1],w_buf,500000);
        printf("the bytes write to pipe222 is %d \n", writenum);
        close(pipe_fd[1]);
    }
    return 0;
}



int main(){
    int pipe_fd[2];
    pid_t pid;
    char r_buf[4];
    char** w_buf[256];
    int childexit=0;
    int i;
    int cmd;
    memset(r_buf,0,sizeof(r_buf));
    if(pipe(pipe_fd)<0){
        printf("pipe create error \n");
        return -1;
    }
    //子进程:解析从管道中获取的命令,并作相应的处理
    if((pid=fork())==0){
        printf(" ");
        close(pipe_fd[1]);//关闭写端
        sleep(2);
        while(!childexit){
            read(pipe_fd[0],r_buf,4);
            cmd=atoi(r_buf);
            if(cmd==0){
                printf("child: receive command from parent over now child process exit \n");
                childexit=1;
            }
            else if(handle_cmd(cmd)!=0){
                return;  
            }
            sleep(1);
        }
        close(pipe_fd[0]);
        exit(1);
    }
    else if(pid>0){
        //parent: send commands to child
        close(pipe_fd[0]);//关闭读端
        w_buf[0]="003";
        w_buf[1]="005";
        w_buf[2]="777";
        w_buf[3]="000";
        for(i=0;i<4;i++){
            write(pipe_fd[1],w_buf[i],4);
            sleep(1);
        }
        close(pipe_fd[1]);
    }
}

//下面是子进程的命令处理函数(特定于应用):
int handle_cmd(int cmd){
    //suppose child only support 256 commands
    if((cmd<0)||(cmd>256)){
        printf("child: invalid command \n");
        return -1;
    }
    printf("child: the cmd from parent is %d \n", cmd);
    return 0;
}

本文转发:http://www.2cto.com/os/201109/102876.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值