⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux环境进程间通信(一):管道及有名管道.htm

📁 描述unix,linux下进程间通信方式
💻 HTM
📖 第 1 页 / 共 4 页
字号:
		ret_size=read(fd,r_buf,r_size);
		if(ret_size==-1)
			if(errno==EAGAIN)
				printf("no data avlaible\n");
		printf("real read bytes %d\n",ret_size);
		sleep(1);
	}	
	pause();
	unlink(FIFO_SERVER);
}
</CODE></PRE></TD></TR></TBODY></TABLE></P>
      <P>程序应用说明:</P>
      <P>把读程序编译成两个不同版本:</P>
      <UL class=n01>
        <LI>阻塞读版本:br 
        <LI>以及非阻塞读版本nbr </LI></UL>
      <P>把写程序编译成两个四个版本:</P>
      <UL class=n01>
        <LI>非阻塞且请求写的字节数大于PIPE_BUF版本:nbwg 
        <LI>非阻塞且请求写的字节数不大于PIPE_BUF版本:版本nbw 
        <LI>阻塞且请求写的字节数大于PIPE_BUF版本:bwg 
        <LI>阻塞且请求写的字节数不大于PIPE_BUF版本:版本bw </LI></UL>
      <P>下面将使用br、nbr、w代替相应程序中的阻塞读、非阻塞读</P>
      <P>验证阻塞写操作:</P>
      <OL class=n01>
        <LI>当请求写入的数据量大于PIPE_BUF时的非原子性: 
        <UL class=n01>
          <LI>nbr 1000 
          <LI>bwg </LI></UL>
        <LI>当请求写入的数据量不大于PIPE_BUF时的原子性: 
        <UL class=n01>
          <LI>nbr 1000 
          <LI>bw </LI></UL></LI></OL>
      <P>验证非阻塞写操作:</P>
      <OL class=n01>
        <LI>当请求写入的数据量大于PIPE_BUF时的非原子性: 
        <UL class=n01>
          <LI>nbr 1000 
          <LI>nbwg </LI></UL>
        <LI>请求写入的数据量不大于PIPE_BUF时的原子性: 
        <UL class=n01>
          <LI>nbr 1000 
          <LI>nbw </LI></UL></LI></OL>
      <P>不管写打开的阻塞标志是否设置,在请求写入的字节数大于4096时,都不保证写入的原子性。但二者有本质区别:</P>
      <P>对于阻塞写来说,写操作在写满FIFO的空闲区域后,会一直等待,直到写完所有数据为止,请求写入的数据最终都会写入FIFO;</P>
      <P>而非阻塞写则在写满FIFO的空闲区域后,就返回(实际写入的字节数),所以有些数据最终不能够写入。</P>
      <P>对于读操作的验证则比较简单,不再讨论。</P>
      <P><SPAN class=atitle3>2.5有名管道应用实例</SPAN></P>
      <P>在验证了相应的读写规则后,应用实例似乎就没有必要了。</P>
      <P><A name=3><SPAN class=atitle2>小结:</SPAN></A></P>
      <P>管道常用于两个方面:(1)在shell中时常会用到管道(作为输入输入的重定向),在这种应用方式下,管道的创建对于用户来说是透明的;(2)用于具有亲缘关系的进程间通信,用户自己创建管道,并完成读写操作。</P>
      <P>FIFO可以说是管道的推广,克服了管道无名字的限制,使得无亲缘关系的进程同样可以采用先进先出的通信机制进行通信。</P>
      <P>管道和FIFO的数据是字节流,应用程序之间必须事先确定特定的传输"协议",采用传播具有特定意义的消息。</P>
      <P>要灵活应用管道及FIFO,理解它们的读写规则是关键。</P>
      <P><A name=a></A>附1:kill -l 的运行结果,显示了当前系统支持的所有信号:</P>
      <P>
      <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 
        width="100%"><TBODY>
        <TR>
          <TD><PRE><CODE>
1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL
5) SIGTRAP	 6) SIGABRT	 7) SIGBUS	 8) SIGFPE
9) SIGKILL	10) SIGUSR1	11) SIGSEGV	12) SIGUSR2
13) SIGPIPE	14) SIGALRM	15) SIGTERM	17) SIGCHLD
18) SIGCONT	19) SIGSTOP	20) SIGTSTP	21) SIGTTIN
22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO
30) SIGPWR	31) SIGSYS	32) SIGRTMIN	33) SIGRTMIN+1
34) SIGRTMIN+2	35) SIGRTMIN+3	36) SIGRTMIN+4	37) SIGRTMIN+5
38) SIGRTMIN+6	39) SIGRTMIN+7	40) SIGRTMIN+8	41) SIGRTMIN+9
42) SIGRTMIN+10	43) SIGRTMIN+11	44) SIGRTMIN+12	45) SIGRTMIN+13
46) SIGRTMIN+14	47) SIGRTMIN+15	48) SIGRTMAX-15	49) SIGRTMAX-14
50) SIGRTMAX-13	51) SIGRTMAX-12	52) SIGRTMAX-11	53) SIGRTMAX-10
54) SIGRTMAX-9	55) SIGRTMAX-8	56) SIGRTMAX-7	57) SIGRTMAX-6
58) SIGRTMAX-5	59) SIGRTMAX-4	60) SIGRTMAX-3	61) SIGRTMAX-2
62) SIGRTMAX-1	63) SIGRTMAX	
</CODE></PRE></TD></TR></TBODY></TABLE></P>
      <P>除了在此处用来说明管道应用外,接下来的专题还要对这些信号分类讨论。</P>
      <P><A name=b></A>附2:对FIFO打开规则的验证(主要验证写打开对读打开的依赖性)</P>
      <P>
      <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 
        width="100%"><TBODY>
        <TR>
          <TD><PRE><CODE>
#include &lt;sys/types.h&gt;
#include &lt;sys/stat.h&gt;
#include &lt;errno.h&gt;
#include &lt;fcntl.h&gt;
#define FIFO_SERVER "/tmp/fifoserver"

int handle_client(char*);
main(int argc,char** argv)
{
	int r_rd;
	int w_fd;
	pid_t pid;

	if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL)&lt;0)&amp;&amp;(errno!=EEXIST))
		printf("cannot create fifoserver\n");
	handle_client(FIFO_SERVER);
	
}

int handle_client(char* arg)
{
int ret;
ret=w_open(arg);
switch(ret)
{
	case 0:
	{	
	printf("open %s error\n",arg);
	printf("no process has the fifo open for reading\n");
	return -1;
	}
	case -1:
	{
		printf("something wrong with open the fifo except for ENXIO");
		return -1;
	}
	case 1:
	{
		printf("open server ok\n");
		return 1;
	}
	default:
	{
		printf("w_no_r return ????\n");
		return 0;
	}
}		
unlink(FIFO_SERVER);
}

int w_open(char*arg)
//0  open error for no reading
//-1 open error for other reasons
//1  open ok
{
	if(open(arg,O_WRONLY|O_NONBLOCK,0)==-1)
	{	if(errno==ENXIO)
		{
			return 0;
		}
		else
		return -1;
	}
	return 1;
	
}
</CODE></PRE></TD></TR></TBODY></TABLE></P>
      <P><A name=resources><SPAN class=atitle2>参考文献:</SPAN></A></P>
      <OL class=n01>
        <LI>UNIX网络编程第二卷:进程间通信,作者:W.Richard 
        Stevens,译者:杨继张,清华大学出版社。丰富的UNIX进程间通信实例及分析,对Linux环境下的程序开发有极大的启发意义。 
        <LI>linux内核源代码情景分析(上、下),毛德操、胡希明著,浙江大学出版社,当要验证某个结论、想法时,最好的参考资料; 
        <LI>UNIX环境高级编程,作者:W.Richard 
        Stevens,译者:尤晋元等,机械工业出版社。具有丰富的编程实例,以及关键函数伴随Unix的发展历程。 
        <LI><A 
        href="http://www.linux.org.tw/CLDP/gb/Secure-Programs-HOWTO/x346.html">http://www.linux.org.tw/CLDP/gb/Secure-Programs-HOWTO/x346.html</A> 
        点明linux下sigaction的实现基础,linux源码../kernel/signal.c更说明了问题; 
        <LI>pipe手册,最直接而可靠的参考资料 
        <LI>fifo手册,最直接而可靠的参考资料 </LI></OL>
      <P><A name=author1><SPAN class=atitle2>关于作者</SPAN></A></P>
      <P>郑彦兴,男,现攻读国防科大计算机学院网络方向博士学位。您可以通过电子邮件 <A 
      href="mailto:mlinux@163.com">mlinux@163.com</A>和他联系。</P><!-- END PAPER BODY--></TD>
    <TD width=10><IMG alt="" border=0 height=1 
      src="Linux环境进程间通信(一):管道及有名管道.files/c.gif" width=10></TD></TR></TBODY></TABLE><BR 
clear=all><IMG alt="" border=0 height=10 
src="Linux环境进程间通信(一):管道及有名管道.files/c.gif" width=100><BR>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
  <TBODY>
  <TR vAlign=top>
    <TD align=right width="100%"><A 
      href="http://www-900.ibm.com/developerWorks/cn/linux/l-ipc/part1/index.shtml#top">到页首</A></TD>
    <TD width=5><IMG alt="" border=0 height=1 
      src="Linux环境进程间通信(一):管道及有名管道.files/c.gif" width=5></TD></TR>
  <TR vAlign=top>
    <TD bgColor=#000000 colSpan=2><IMG alt="" border=0 height=1 
      src="Linux环境进程间通信(一):管道及有名管道.files/c.gif" width=100></TD></TR>
  <TR vAlign=top>
    <TD bgColor=#ffffff colSpan=2><IMG alt="" border=0 height=8 
      src="Linux环境进程间通信(一):管道及有名管道.files/c.gif" width=100></TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=10 cellSpacing=0 width="100%">
  <TBODY>
  <TR vAlign=top>
    <TD>
      <FORM action=/developerWorks/cn/cnratings.nsf/RateArticle?CreateDocument 
      method=post name=getURL><INPUT name=ArticleTitle type=hidden 
      value=Linux环境进程间通信(一):管道及有名管道> <INPUT name=url type=hidden>
      <SCRIPT language=javascript>getURL();</SCRIPT>
       <INPUT name=Zone type=hidden value=linux> <INPUT name=RedirectURL 
      type=hidden value=/developerWorks/cn/thankyou/feedback-linux.html> <A 
      name=rating><B>您对这篇文章的看法如何?</B></A> 
      <TABLE border=0 cellPadding=0 cellSpacing=0 width=600>
        <TBODY>
        <TR>
          <TD colSpan=5><IMG alt="" border=0 height=8 
            src="Linux环境进程间通信(一):管道及有名管道.files/c.gif" width=100></TD></TR>
        <TR vAlign=top>
          <TD width="16%"><INPUT name=Rating type=radio value=5>真棒!(5)</TD>
          <TD width="20%"><INPUT name=Rating type=radio value=4>好材料 (4)</TD>
          <TD width="24%"><INPUT name=Rating type=radio value=3>一般;尚可 (3)</TD>
          <TD width="22%"><INPUT name=Rating type=radio value=2>需提高 (2)</TD>
          <TD width="18%"><INPUT name=Rating type=radio value=1>太差! 
        (1)</TD></TR></TBODY></TABLE><BR><B>建议?</B><BR><TEXTAREA cols=60 name=Comments rows=5 wrap=virtual></TEXTAREA><BR><BR><INPUT type=submit value=提交反馈意见></FORM></TD></TR>
  <TR vAlign=top>
    <TD bgColor=#ffffff><IMG alt="" border=0 height=8 
      src="Linux环境进程间通信(一):管道及有名管道.files/c.gif" width=100></TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
  <TBODY>
  <TR>
    <TD align=right>(c) Copyright IBM Corp. 2001, (c) Copyright IBM China 
      2001, All Right Reserved</TD></TR>
  <TR vAlign=top>
    <TD class=bbg height=21>&nbsp;&nbsp;<A class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/index.shtml&amp;origin=dwhead">关于 
      IBM</A><SPAN class=divider>&nbsp;&nbsp;|&nbsp;&nbsp;</SPAN><A 
      class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/privacy/index.shtml&amp;origin=dwhead">隐私条约</A><SPAN 
      class=divider>&nbsp;&nbsp;|&nbsp;&nbsp;</SPAN><A class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/legal/index.shtml&amp;origin=dwhead">使用条款</A><SPAN 
      class=divider>&nbsp;&nbsp;|&nbsp;&nbsp;</SPAN><A class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/contact/index.shtml&amp;origin=dwhead">联系 
      IBM</A></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript1.2 src="Linux环境进程间通信(一):管道及有名管道.files/stats.js" 
type=text/javascript></SCRIPT>
<NOSCRIPT><IMG alt="" border=0 height=1 
src="F:\项目文档\进程间通信\Linux环境进程间通信(一):管道及有名管道.files\c(1).gif" width=1></NOSCRIPT> 
</A></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -