函数
创建管道 知识点
进程间通信的基本概念
对进程间通信的基本理解通过管道实现进程间通信 实例
函数 创建管道#include知识点 进程间通信的基本概念@param filedes[0]:通过管道接收数据时使用的文件描述符,即管道出口 @parma filedes[1]:通过管道传输数据时使用的文件描述符,即管道入口 int pipe(int filedes[2]) //成功返回0.失败返回-1 以长度为2的int数组地址符作为参数调用上述函数,数组中存有两个文件描述符,它们被作为管道的出口和入口。 父进程调用该函数时创建管道,同时获取对应于出入口的文件描述符,此时父进程可读写统一管道。 而父进程与子进程进行数据交换则通过将入口或出口中的1个文件描述符传递给子进程。 通过调用fork函数来实现将文件描述符传递给子进程。 如: int fds[2]; pipe(fds); pid_t pid=fork(); if(pid==0) { write(fds[1),str,sizeof(str)); } else { read(fds[0],buf,BUF_SIZE); puts(buf); }
进程间通信(Inter Process Communication)意味着两个不同进程间可以交换数据,为完成这点, *** 作系统中应提供两个进程可以同时访问的内存空间。
对进程间通信的基本理解进程A通过某变量将自己的状态通知给进程B,进程B通过该变量了解到进程A的转台。即只要有两个进程可以同时访问的内存空间,就可以通过此空间交换数据。
但进程具有完全独立的内存结构,就连通过fork函数创建的子进程也不会与父进程共享内存空间。因此,进程间通信智能通过其他特殊方法形成。
为完成进程间通信,需创建管道。管道并非属于进程的资源,而是和套接字一样,属于 *** 作系统,故两个进程通过 *** 作系统提供的内存空间进行通信。
创建管道函数见函数区域。
###通过管道进行进程间双向通信
int fds[2]; pipe(fds); pid_t pid=fork(); if(pid==0) { write(fds[1),str1,sizeof(str));//写入管道 sleep(2); read(fds[0],buf,BUF_SIZE);//从管道读取 } else//父进程 { read(fds[0],buf,BUF_SIZE);//从管道读取 sleep(2); write(fds[1],str2,sizeof(str2));//写入管道 }
数据进入管道后成为无主数据,通过read函数先读取数据的进程将得到数据,即使进程将数据传到管道。
因此只使用1个管道进行双向通信并非易事,为此通过"创建2个管道"来实现双向通信,各自负责不同的数据流。
通过fork传递管道文件描述符:
通过1个管道实现双向通信:
通过2个管道实现双向通信:
保存消息的回声服务器端:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)