进程和线程(二)

来源:互联网 发布:王柳雯淘宝店 编辑:程序博客网 时间: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