- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
中南大学数学院计算机操作系统第六章课件文件系统.ppt
* 6.7.4有名管道 只有与生成管道文件的进程属同一簇的进程之间才能利用無名管道pipe机构进行通信,其他的进程甚至感觉不到该管道的存在。 有名管道则像普通文件一样有其目录项,在文件系统中能长久地存在,任何有访问权限的用户都可以通过路径名来打开它,进而存取其中数据,因此无关的进程就可以通过有名管道进行通信。 * 尽管有名管道的结构像文件,但它的功能像管道。数据按先进先出的次序写入或读出,核心保证读写FIFOs的操作是原子级的。核心也同样提供对有名管道文件的lseek操作。 有名管道的I节点与无名管道一样,除了10个直接地址索引项外,剩余的索引项改成了读写指针和读写进程计数等。 * 1.创建有名管道 目录、特别文件和有名管道文件只能用mknod创建。但是,创建普通文件、目录和特别文件的mknod调用只对超级用户开放,而所有的用户都能用mknod创建有名管道文件。 #include sys/types.h #include sys/stat.h int mknod(pathname,mode,device); char *pathname; /* 有名管道文件名 */ int mode,device; /* 存取限权等,设备号 */ 创建普通文件、目录和有名管道文件时参数device被忽略。例如,创建一个所有的用户都能读和写的有名管道文件的系统调用为: mknod(fifos,S_IFIFO|0666,0) * 2.有名管道的打开 在创建了有名管道后,任何进程都可以用与打开文件相同的系统调用打开一个有名管道文件,如: fd=open(fifos,O_WRONLY); mknod只是创建有名管道文件,但并不打开它。通常,当为读而打开一个FIFOs时,进程就会进入等待状态,直至另一进程为写而打开同一个FIFOs。反之为写而打开时,进程也要等待读打开。 在调用open时如设置了O_NDELAY标志,当为读而打开时,进程就不等待写打开。但在没有进程为读而打开管道文件的情况下,设置O_NDELAY的为写而打开的调用就返回一个出错信息,进程在处理错误后还要重试open操作。 * 3.有名管道的读写、关闭与删除 有名管道的读、写、关闭调用与无名管道一样,在关闭了一个有名管道后,它所使用的磁盘空间全部释放,这点与普通文件不一样,但有名管道本身并没有消失也即它所占的目录项和磁盘I节点还在。要删除一个有名管道,可利用与删除一个文件相同的调用: unlink(pathname); * 有名管道进行通信的例子 下面是两个独立的程序使用有名管道进行通信的例子。 第一个程序创建一个所有用户都有读写许可的有名管道fifo,并以写方式打开它,此后循环地向其中写入数据, 第二个程序以读方式打开同一个有名管道,并从中读数据。(注:下面程序省略了头文件和变量说明) * main( ) { mknod (fifo, S_IFIFO|0666,0); fd = open (fifo,O_WRONLY); while (gets(buf)!=NULL) // 危险操作的警告 write (fd, buf, strlen(buf)+1); close (fd); } main ( ) { fd = open (fifo,O_RDONLY | O_NDELAY); while ((n = read (fd,buf,sizeof(buf) ))! = -1) if (n = = 0) sleep (NAPTIME) else puts (buf); close (fd); } * #include stdio.h // NULL 的说明 #includesys/stst.h // S_IFIFO的说明 #include fcntl.h // O_WRONLY 的说明 main( ) { int fd; char buf [256]; mknod (fifo, S_IFIFO|0666,0); fd = open (fifo,O_WRONLY); while (gets(buf)!=NULL) write (fd, buf, strlen(buf)+1); close (fd); } * #include fcntl.h // O_RDONLY的说明 main ( ) { int fd,n; char buf [256]; fd = open (fifo,O_RDONLY | O_NDELAY); while (
文档评论(0)