进程和线程(二)
来源:互联网 发布:王柳雯淘宝店 编辑:程序博客网 时间:2024/05/16 09:57
进程间的通信
一、无名管道通信
(1)什么是无名管道
1、只可以应用在亲缘进程之间进行通信。
2、有两个描述符,一个为读(0),一个为写(1)。
3、管道通信之前需要先创建进程fork()/vfork()。
4、只可单向通信。
(2)建立无名管道
pipe(int fd[2]);
fd:两个读写的描述符。每次需要关闭一个开启一个。
成功返回0,失败返回-1.
流程:
创建进程——创建管道——在子/父进程中——关闭读/写端口——写/读内容——关闭写/读端口
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>int main(){int i;int fd1[2];int fd2[2];int pid,pid2;char r_buf[100];char w_buf[100];char name[100];memset(r_buf,0,sizeof(r_buf));memset(w_buf,0,sizeof(w_buf));if(pipe(fd1) < 0 || pipe(fd2) < 0){printf("pipe create fail!\n");}if((pid = fork()) == 0){close(fd1[1]);close(fd2[0]);sleep(1);read(fd1[0],r_buf,100);for(i = 0;i < 100;i++){if(r_buf[i] > 'a' && r_buf[i] < 'z'){r_buf[i] -= 32;}}write(fd2[1],r_buf,strlen(r_buf)); close(fd1[0]);close(fd2[1]);exit(0);}else if(pid > 0){close(fd1[0]);close(fd2[1]);sleep(1);printf("Please input:\n");scanf("%s",name);strcpy(w_buf,name);write(fd1[1],w_buf,strlen(w_buf));read(fd2[0],w_buf,100);printf("%s",w_buf);close(fd1[1]);close(fd2[0]);}}
二、有名管道通信
(1)有名管道
1、解决了非亲缘之间的通信
2、通过以FIFO文件的形式存于文件系统之中。
3、遵循先进先出。
(2)建立有名管道
mkfifo(const char * pathname,mode_t mode);
pathname:文件路径
mode:权限
read:
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<errno.h>#include<sys/stat.h>#include<string.h>#define FIFO_SERVER "/home/1703/namepipe/fifoserver"int main(int argc,char ** argv){char r_buf[1024*8];int fd;int r_size;int ret_size;r_size = atoi(argv[1]);printf("The real size is %d\n",r_size);memset(r_buf,0,sizeof(r_buf));fd = open(FIFO_SERVER,O_RDONLY);if(fd == -1){printf("open fail!\n");exit(-1);}while(1){memset(r_buf,0,sizeof(r_buf));ret_size = read(fd,r_buf,r_size);if(ret_size == -1){if(errno == EAGAIN)printf("no data!\n");}else{if(ret_size == 0)exit(-1);printf("The real string is %s,num is %d \n",r_buf,ret_size);sleep(1);}}unlink(FIFO_SERVER);}
write:
#include<stdio.h>#include<stdlib.h>#include<fcntl.h>#include<unistd.h>#include<errno.h>#include<string.h>#define FIFO_SERVER "/home/1703/namepipe/fifoserver"int main(){int fd;char w_buf[1024*8];int real_wnum;memset(w_buf,0,sizeof(w_buf));if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL) < 0)&&(errno != EEXIST)){printf("cannot create fifoserver\n");exit(-1);}fd = open(FIFO_SERVER,O_WRONLY);if(fd == -1){if(errno == ENXIO)printf("open error!\n");}while(1){printf("Please input characters:\n");scanf("%s",w_buf);if(strcmp(w_buf,"end") == 0){exit(0);}real_wnum = write(fd,w_buf,strlen(w_buf));if(real_wnum == -1){if(errno == EAGAIN){printf("write to file fail!\n");}}elseprintf("input %d characters!\n",real_wnum);}unlink(FIFO_SERVER);}
0 0
- 进程和线程(二)
- 进程和线程(二)
- 操作系统(二):进程和线程管理_1_进程、线程
- Android 进程和线程(二)
- Android 进程和线程(二)
- python学习(二):并行开发(线程和进程)
- Windows CE 进程、线程和内存管理(二)
- Windows CE 进程、线程和内存管理(二)
- python学习笔记(4)-进程和线程(二)-多线程
- 操作系统(二):进程和线程管理_3_处理机调度
- 进程与线程(二)
- 进程、线程(面试二)
- 操作系统(二)进程&线程
- Android进程与线程(二):线程
- 05.进程和线程编程之二
- oc基础总结二 线程和进程
- Linux内核学习(二)---Linux中的进程、线程和轻量级进程
- 操作系统笔记(二)---进程、线程
- [算法] 字符串
- 1294 全排列
- AOP和fifter(OOP)的区别和联系
- 算法入门经典二叉树DFS题目UVA548 Tree
- web实现电脑屏幕和手机屏幕适应
- 进程和线程(二)
- 深入浅出解释FFT(五)——FFT结果的物理意义
- Maven instal Could not resolve dependencies for project 找不到本地仓库下的jar
- CF
- 最小堆最大堆的详细解读
- MyBatis学习笔记(一)
- Android Studio中导入SlidingMenu(详解)
- poj1979 测试用例全通过,但提交就是WA,无解。
- 两台不同网段的PC直连是否可以相互ping通