无名管道的系统调用.doc_第1页
无名管道的系统调用.doc_第2页
无名管道的系统调用.doc_第3页
无名管道的系统调用.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

无名管道系统调用1管道创建与关闭说明管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd0和fd1,其中fd0固定用于读管道,而fd1固定用于写管道,如图1所示,这样就构成了一个半双工的通道。图1 无名管道的读写机制管道关闭时只需将这两个文件描述符关闭即可,可使用普通的close()函数逐个关闭各个文件描述符。2管道创建函数创建管道可以通过调用pipe()来实现。表1列出了pipe()函数的语法要点。表1 pipe()函数语法要点3管道读写说明用pipe()函数创建的管道两端处于一个进程中,由于管道是主要用于在不同进程间通信的,因此在实际应用中没有太大意义。实际上,通常先是创建一个管道,再调用fork()函数创建一个子进程,该子进程会继承父进程所创建的管道,这时,父子进程管道的文件描述符对应关系如图2所示。 图2 父子进程管道的文件描述符对应关系此时的关系看似非常复杂,实际上却已经给不同进程之间的读写创造了很好的条件。父子进程分别拥有自己的读写通道,为了实现父子进程之间的读写,只需把无关的读端或写端的文件描述符关闭即可。例如,在图3中将父进程的写端fd1和子进程的读端fd0关闭。此时,父子进程之间就建立起了一条“子进程写入父进程读取”的通道。图3 关闭父进程fd1和子进程fd0同样,也可以关闭父进程的fd0和子进程的fd1,这样就可以建立一条“父进程写入子进程读取”的通道。另外,父进程还可以创建多个子进程,各个子进程都继承了相应的fd0和fd1。这时,只需关闭相应端口就可以建立其各子进程间的通道。4管道读写注意点管道读写需注意以下几点: 只有在管道的读端存在时,向管道写入数据才有意义。否则,向管道写入数据的进程将收到内核传来的SIGPIPE信号(通常为Broken pipe错误)。 向管道写入数据时,Linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读取管道缓冲区中的数据,那么写操作将会一直阻塞。 父子进程在运行时,它们的先后次序并不能保证。因此,为了保证父子进程已经关闭了相应的文件描述符,可在两个进程中调用sleep()函数。当然这种调用不是很好的解决方法,在后面学到进程之间的同步机制与互斥机制后,请读者自行修改本小节的实例程序。5使用实例在本例中,首先创建管道,之后父进程使用fork()函数创建子进程,最后通过关闭父进程的读描述符和子进程的写描述符,建立起它们之间的管道通信。/* pipe.c */#include #include #include #include #include #define MAX_DATA_LEN 256#define DELAY_TIME 1int main()pid_t pid;int pipe_fd2;char bufMAX_DATA_LEN;const char data = Pipe Test Program;int real_read, real_write;memset(void*)buf, 0, sizeof(buf);if (pipe(pipe_fd) 0)printf(%d bytes read from the pipe is %sn, real_read, buf);close(pipe_fd0); /* 关闭子进程读描述符 */exit(0);else if (pid 0)/* 父进程关闭读描述符,并通过使父进程暂停1s等待子进程已关闭相应的写描述符 */close(pipe_fd0);sleep(DELAY_TIME);if(real_write = write(pipe_fd1, data, strlen(data) != -1)printf(Parent wrote %d bytes : %sn, real_write, data);close(pipe_fd1); /* 关闭父进程写描述符 */waitpid(pid, NULL, 0); /* 收集子进程退出信息 */exit(0); 将该程序交叉编译,下载到开发板上的运行结果如下:$ ./pip

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论