管道实现处理分工,实现两数想加 linux环境高级编程
来源:互联网 发布:计算机java二级考试 编辑:程序博客网 时间:2024/05/29 11:45
add2,这个实现两个数相加,编译成add2
#include <fcntl.h>#include <stdio.h>#include "apue.h"#include <errno.h>#include <sys/wait.h>#include <sys/types.h>#include <unistd.h>#include <stropts.h>#include <sys/mman.h>int main(int argc , char *argv[]){int n,int1,int2,int3;char line[MAXLINE];while((n=read(STDIN_FILENO,line,MAXLINE))>0){line[n]=0;if(sscanf(line,"%d%d%d",&int1,&int2,&int3)==3){ sprintf(line,"%d\n",int1+int2+int3); n=strlen(line); if(write(STDOUT_FILENO,line,n)!=n)err_sys("write 1 erro");}else{if(write(STDOUT_FILENO,"invalid args\n",13)!=13)err_sys("write 2erro");} }exit(0);}
父进程 pipe 子进程
fd2[0] <----- fd2[1]=STDOUT_FILENO 读过程
fd1[1] -----> fd1[0]=STDIN_FILENO 写过程
以下程序使用管道。子进程负责处理,并exel (add2)程序,并吧处理完的数据通过管道 fd2[1]发送给父进程
#include <fcntl.h>#include <stdio.h>#include "apue.h"#include <errno.h>#include <sys/wait.h>#include "sys/types.h"#include <unistd.h>#include <stropts.h>#include <sys/mman.h>static void sig_pipe(int signo){printf("SIGPIPE has been received\n");exit(1);}int main(int argc , char *argv[]){int n,fd1[2],fd2[2];char line[MAXLINE];pid_t pid;if(signal(SIGPIPE,sig_pipe)<0)err_sys("pipe erro");if(pipe(fd1)<0||pipe(fd2)<0)err_sys("pipe err");if((pid=fork())<0)err_sys("fork err");else if(pid>0){close(fd1[0]);close(fd2[1]);while(fgets(line,MAXLINE,stdin)!=NULL){n=strlen(line);if(write(fd1[1],line,n)!=n)err_sys("parent write fd1[1] erro");if((n=read(fd2[0],line,MAXLINE))<0)err_sys("parent read fd2[0] erro");n=strlen(line);if(n==0)break;line[n]=0;if(fputs(line,stdout)==EOF)err_sys("parent 2 write stdout err");}exit(1);}else {close(fd2[0]);close(fd1[1]);if(fd2[1]!=STDOUT_FILENO){if(dup2(fd2[1],STDOUT_FILENO)<0)err_sys("dup2 fd2[1] erro");close(fd2[1]);}if(fd1[0]!=STDIN_FILENO){if(dup2(fd1[0],STDIN_FILENO)<0)err_sys("dup2 fd1[0] erro");close(fd1[0]);}if(execl("./add2","add2",(char *)0)<0)err_sys("execl erro");}exit(0);}
- 管道实现处理分工,实现两数想加 linux环境高级编程
- UNIX环境高级编程学习之第十五章进程间通信 - 通过有名管道(命名管道)实现进程间通信
- 【linux高级环境编程学习笔记一】管道通信
- UNIX环境高级编程学习之第十五章进程间通信 - 通过半双工匿名管道实现父子进程通信
- UNIX环境高级编程学习之第十五章进程间通信 - 通过匿名管道实现父子进程同步
- 《UNIX环境高级编程》笔记--管道
- Linux管道实现机制
- Linux下实现管道
- 【Linux】中的管道实现
- linux 管道实现解析
- Linux环境高级编程
- Linux环境高级编程--出错处理(CLStatus)
- linux系统编程之管道实现父系进程间通信
- [Linux C编程]有名管道实现守护进程
- linux中的管道实现和管道
- 《Unix环境高级编程》:单实例守护进程的实现
- 实现cp函数(UNIX环境高级编程课后题)
- UNIX环境高级编程——实现uid to name
- TCP/IP、Http、Socket的区别
- C# 删除word的指定页
- 一条没有鱼鳔的鱼
- 单身快乐(致一个人的情人节)
- 感悟
- 管道实现处理分工,实现两数想加 linux环境高级编程
- 9-17ASP第一节
- 经典数据结构B+树
- NSArray中数据排序方法
- 原子操作及其重要性
- 关于爱情
- PHP生成条形码
- linux wget
- cocos2d精灵与动画详解