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

📄 chinaunix_net - unix进程之间的通信.htm

📁 描述unix,linux下进程间通信方式
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            <BR>perror("msgsnd"); <BR>exit(1); <BR>} <BR>} 
            <BR><BR>void&nbsp;read_message(int&nbsp;qid,&nbsp;struct&nbsp;mymsgbuf&nbsp;*qbuf,&nbsp;long&nbsp;type) 
            <BR>{ 
            <BR>/*&nbsp;Read&nbsp;a&nbsp;message&nbsp;from&nbsp;the&nbsp;queue&nbsp;*/ 
            <BR>printf("Reading&nbsp;a&nbsp;message&nbsp;...\n"); 
            <BR>qbuf-&gt;mtype&nbsp;=&nbsp;type; 
            <BR>msgrcv(qid,&nbsp;(struct&nbsp;msgbuf&nbsp;*)qbuf,&nbsp;MAX_SEND_SIZE,&nbsp;type,&nbsp;0); 
            <BR><BR>printf("&nbsp;Type:&nbsp;%ld&nbsp;Text:&nbsp;%s\n",&nbsp;qbuf-&gt;mtype,&nbsp;qbuf-&gt;mtext); 
            <BR>} <BR><BR>void&nbsp;remove_queue(int&nbsp;qid) <BR>{ 
            <BR>/*&nbsp;Remove&nbsp;the&nbsp;queue&nbsp;*/ 
            <BR>msgctl(qid,&nbsp;IPC_RMID,&nbsp;0); <BR>} 
            <BR><BR>void&nbsp;change_queue_mode(int&nbsp;qid,&nbsp;char&nbsp;*mode) 
            <BR>{ <BR>struct&nbsp;msqid_ds&nbsp;myqueue_ds; 
            <BR><BR>/*&nbsp;Get&nbsp;current&nbsp;info&nbsp;*/ 
            <BR>msgctl(qid,&nbsp;IPC_STAT,&nbsp;&amp;myqueue_ds); 
            <BR><BR>/*&nbsp;Convert&nbsp;and&nbsp;load&nbsp;the&nbsp;mode&nbsp;*/ 
            <BR>sscanf(mode,&nbsp;"%ho",&nbsp;&amp;myqueue_ds.msg_perm.mode); 
            <BR><BR>/*&nbsp;Update&nbsp;the&nbsp;mode&nbsp;*/ 
            <BR>msgctl(qid,&nbsp;IPC_SET,&nbsp;&amp;myqueue_ds); <BR>} 
            <BR><BR>void&nbsp;usage(void) <BR>{ 
            <BR>fprintf(stderr,&nbsp;"msgtool&nbsp;-&nbsp;A&nbsp;utility&nbsp;for&nbsp;tinkering&nbsp;with&nbsp;msg&nbsp;queues\n"); 
            <BR>fprintf(stderr,&nbsp;"\nUSAGE:&nbsp;msgtool&nbsp;(s)end&nbsp;&lt;type&gt;&nbsp;&lt;messagetext&gt;&nbsp;&lt;msgid&gt;\n"); 
            <BR>fprintf(stderr,&nbsp;"&nbsp;(r)ecv&nbsp;&lt;type&gt;\n"); 
            <BR>fprintf(stderr,&nbsp;"&nbsp;(d)elete\n"); 
            <BR>fprintf(stderr,&nbsp;"&nbsp;(m)ode&nbsp;&lt;octal&nbsp;mode&gt;\n"); 
            <BR>fprintf(stderr,&nbsp;"note:&nbsp;type&nbsp;must&nbsp;be&nbsp;number!\n"); 
            <BR>exit(1); <BR>} <BR><BR><BR>2,Tcp/IP&nbsp;socket编程例子 
            <BR><BR>1),&nbsp;Client方 <BR><BR>#include&nbsp;&lt;stdio.h&gt; 
            <BR>#include&nbsp;&lt;sys/types.h&gt; 
            <BR>#include&nbsp;&lt;sys/socket.h&gt; 
            <BR>#include&nbsp;&lt;netinet/in.h&gt; 
            <BR>#include&nbsp;&lt;arpa/inet.h&gt; 
            <BR>#include&nbsp;&lt;netdb.h&gt; 
            <BR><BR>int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;*argv[]) <BR>{ 
            <BR>int&nbsp;sockfd&nbsp;,newsockfd,&nbsp;help,&nbsp;sent; 
            <BR>struct&nbsp;sockaddr_in&nbsp;peer; 
            <BR>struct&nbsp;hostent&nbsp;*serverhost; <BR>char&nbsp;buff[5000]; 
            <BR><BR><BR>if(argc&lt;2)&nbsp;{ 
            <BR>fprintf(stderr,&nbsp;"Usage:&nbsp;coc&nbsp;&lt;hostname&gt;\n"); 
            <BR>exit(1); <BR>} 
            <BR><BR>if&nbsp;((sockfd&nbsp;=&nbsp;socket(AF_INET,SOCK_STREAM,0))&nbsp;&lt;&nbsp;0&nbsp;)&nbsp;{ 
            <BR>perror("socket"); <BR>exit(1); <BR>} 
            <BR><BR><BR>if((serverhost&nbsp;=&nbsp;gethostbyname(argv[1]))&nbsp;==&nbsp;0)&nbsp;{ 
            <BR>perror("gethostbyname"); <BR>exit(1); <BR>} 
            <BR><BR><BR>peer.sin_family&nbsp;=&nbsp;AF_INET; 
            <BR>peer.sin_port&nbsp;=&nbsp;htons(10000);&nbsp; 
            <BR>peer.sin_addr&nbsp;=&nbsp;*(struct&nbsp;in_addr*)serverhost-&gt;h_addr_list[0]; 
            <BR><BR>if&nbsp;(connect(sockfd,&nbsp;&amp;peer,&nbsp;sizeof(peer))&nbsp;&lt;&nbsp;0&nbsp;)&nbsp;{ 
            <BR>perror("connect"); <BR>exit(1); <BR>} 
            <BR><BR>for(help=0;&nbsp;help&lt;sizeof(buff);&nbsp;help++) 
            <BR>buff[help]&nbsp;=&nbsp;'0'+help%10; 
            <BR><BR>write(sockfd,&nbsp;buff,&nbsp;5000); <BR><BR>close(sockfd); 
            <BR>} <BR><BR><BR>2,&nbsp;Server方 
            <BR><BR>#include&nbsp;&lt;stdio.h&gt; 
            <BR>#include&nbsp;&lt;sys/types.h&gt; 
            <BR>#include&nbsp;&lt;sys/socket.h&gt; 
            <BR>#include&nbsp;&lt;netinet/in.h&gt; 
            <BR><BR>void&nbsp;process(int&nbsp;fd) <BR>{ 
            <BR>char&nbsp;buff[10000]; <BR>int&nbsp;received; 
            <BR>int&nbsp;help,read_bytes; <BR><BR>received&nbsp;=&nbsp;5000; 
            <BR>memset&nbsp;(&nbsp;buff,&nbsp;'.',&nbsp;received&nbsp;); 
            <BR>read_bytes&nbsp;=&nbsp;read(fd,&nbsp;buff,&nbsp;received); 
            <BR>if&nbsp;(read_bytes&nbsp;&lt;&nbsp;0)&nbsp;{ <BR>perror("read"); 
            <BR>exit(1); <BR>} 
            <BR><BR>printf("%d&nbsp;bytes&nbsp;have&nbsp;received&nbsp;on&nbsp;socket&nbsp;%d\n",&nbsp;read_bytes,&nbsp;fd); 
            <BR>printf("buff=\n%s\n",&nbsp;buff); 
            <BR>for(help=0;&nbsp;help&lt;received;&nbsp;help++) 
            <BR>if(buff[help]&nbsp;!=&nbsp;'0'+help%10)&nbsp; <BR>{ 
            <BR>printf("Error&nbsp;on&nbsp;position&nbsp;%d\n",&nbsp;help);&nbsp; 
            <BR>break; <BR>} <BR>} <BR><BR>int&nbsp;main(void) <BR>{ 
            <BR>int&nbsp;sockfd&nbsp;,newsockfd; 
            <BR>struct&nbsp;sockaddr_in&nbsp;myaddr,&nbsp;peer; 
            <BR><BR>int&nbsp;addrlen1,addrlen2; 
            <BR><BR>if&nbsp;((sockfd&nbsp;=&nbsp;socket(AF_INET,SOCK_STREAM,0))&nbsp;&lt;&nbsp;0&nbsp;)&nbsp;{ 
            <BR>perror("socket"); <BR>exit(1); <BR>} 
            <BR><BR>addrlen1&nbsp;=&nbsp;sizeof(myaddr); 
            <BR><BR>myaddr.sin_family&nbsp;=&nbsp;AF_INET; 
            <BR>myaddr.sin_port&nbsp;=&nbsp;htons(10000); 
            <BR>myaddr.sin_addr.s_addr&nbsp;=&nbsp;INADDR_ANY; 
            <BR>if&nbsp;(bind(sockfd,&nbsp;&amp;myaddr&nbsp;,&nbsp;addrlen1)&nbsp;&lt;&nbsp;0&nbsp;)&nbsp;{ 
            <BR>perror("bind"); <BR>exit(1); <BR>} 
            <BR><BR>if&nbsp;(listen(sockfd,&nbsp;5&nbsp;))&nbsp;{ 
            <BR>perror("listen"); <BR>exit(1); <BR>} <BR><BR>for&nbsp;(;;) <BR>{ 
            <BR>addrlen2&nbsp;=&nbsp;sizeof(peer); 
            <BR>newsockfd&nbsp;=&nbsp;accept(sockfd,&nbsp;&amp;peer&nbsp;,&nbsp;&amp;addrlen2); 
            <BR>if&nbsp;(&nbsp;newsockfd&nbsp;&lt;&nbsp;0)&nbsp;{ 
            <BR>perror("accept"); <BR>exit(1); <BR>} 
            <BR>if&nbsp;(fork()&nbsp;==&nbsp;0)&nbsp;{ <BR>close(sockfd); 
            <BR><BR>/*&nbsp;process&nbsp;request&nbsp;*/ 
            <BR>printf("connection&nbsp;on&nbsp;socket&nbsp;%d&nbsp;from&nbsp;%s\n",&nbsp;newsockfd,&nbsp;inet_ntoa(peer.sin_addr.s_addr)); 
            <BR>process(newsockfd); <BR>close(newsockfd); <BR>exit(0); <BR><BR>} 
            <BR>close(newsockfd); <BR>} <BR>} <BR><BR><BR>3,共享内存编程例子 
            <BR><BR>例子1: <BR><BR>#include&nbsp;&lt;sys/types.h&gt; 
            <BR><BR>#include&nbsp;&lt;sys/ipc.h&gt; 
            <BR><BR>#include&nbsp;&lt;sys/shm.h&gt; 
            <BR><BR>#define&nbsp;SHMKEY&nbsp;74 <BR><BR>#define&nbsp;K&nbsp;1024 
            <BR><BR>int&nbsp;shmid; <BR><BR>cleanup() <BR><BR>{ 
            <BR><BR>shmctl(shmid,IPC_RMID,0); <BR><BR>exit(0); <BR><BR>} 
            <BR><BR>main() <BR><BR>{ <BR><BR>int&nbsp;*pint; 
            <BR><BR>char&nbsp;*addr1,*addr2; 
            <BR><BR>extern&nbsp;char&nbsp;*shmat(); 
            <BR><BR>extern&nbsp;cleanup(); <BR><BR>for&nbsp;(i=0;i&lt;20;i++) 
            <BR><BR>signal(i,cleanup); 
            <BR><BR>shmid=shmget(SHMKEY,128*K,0777|IPC_CREAT); 
            <BR><BR>addr1=shmat(shmid,0,0); <BR><BR>addr2=shmat(shmid,0,0); 
            <BR><BR>printf("addr1&nbsp;0x%x&nbsp;addr2&nbsp;0x%x\n",addr1,addr2); 
            <BR><BR>pint=(int*)addr1; <BR><BR>for&nbsp;(i=0;i&lt;256;i++) 
            <BR><BR>*pint++=i; <BR><BR>pint=(int*)addr1; <BR><BR>*pint=256; 
            <BR><BR>pint=(int*)addr2; <BR><BR>for&nbsp;(i=0;i&lt;256;i++) 
            <BR><BR>printf("index&nbsp;%d\tvalue%d\n",i,*pint++); 
            <BR><BR>shmdt(addr1); <BR><BR>shmdt(addr2); <BR><BR>pause(); 
            <BR><BR>} <BR><BR>例子2 <BR><BR>1),创建和写共享内存: 
            <BR><BR>/*&nbsp;Includes&nbsp;*/ <BR>#include&nbsp;&lt;errno.h&gt; 
            <BR>#include&nbsp;&lt;stdio.h&gt; <BR>#include&nbsp;&lt;stdlib.h&gt; 
            <BR>#include&nbsp;&lt;string.h&gt; 
            <BR>#include&nbsp;&lt;sys/types.h&gt; 
            <BR>#include&nbsp;&lt;sys/ipc.h&gt; 
            <BR>#include&nbsp;&lt;sys/shm.h&gt; <BR><BR>typedef&nbsp;struct 
            <BR>{ <BR>int&nbsp;tc_number; <BR>char&nbsp;ap_name[5]; 
            <BR>char&nbsp;mymessage[20]; <BR><BR>}&nbsp;COMM_TABLE; 
            <BR><BR>main() <BR>{ <BR><BR>/*&nbsp;local&nbsp;variables&nbsp;*/ 
            <BR>int&nbsp;ret=&nbsp;0; <BR>key_t&nbsp;key; <BR>int&nbsp;i; 
            <BR>int&nbsp;shm_id; <BR>int&nbsp;found&nbsp;=&nbsp;0; 
            <BR>COMM_TABLE&nbsp;*comm_reg; 
            <BR><BR>key&nbsp;=&nbsp;ftok(".",'w'); 
            <BR><BR>/*&nbsp;create&nbsp;a&nbsp;share&nbsp;memory&nbsp;if&nbsp;not&nbsp;exist&nbsp;*/ 
            <BR>if&nbsp;((shm_id&nbsp;=&nbsp;shmget(key&nbsp;,sizeof(COMM_TABLE),IPC_CREAT|IPC_EXCL|0666))&nbsp;==&nbsp;-1) 
            <BR>{ 
            <BR>/*&nbsp;share&nbsp;memory&nbsp;has&nbsp;been&nbsp;created&nbsp;*/ 
            <BR>if&nbsp;((shm_id&nbsp;=&nbsp;shmget(key&nbsp;,&nbsp;sizeof(COMM_TABLE),0))&nbsp;==&nbsp;-1) 
            <BR>{ <BR>printf("error&nbsp;=&nbsp;%d\n",&nbsp;errno); 
            <BR>return&nbsp;(ret); <BR><BR>} <BR>} 
            <BR>comm_reg&nbsp;=&nbsp;(COMM_TABLE&nbsp;*)&nbsp;shmat(shm_id,&nbsp;(char&nbsp;*)&nbsp;0,&nbsp;SHM_SHARE_MMU); 
            <BR>comm_reg-&gt;tc_number=&nbsp;56110563; <BR>} 
            <BR><BR>2),&nbsp;读共享内存,再删除共享内存: <BR><BR>/*&nbsp;Includes&nbsp;*/ 
            <BR>#include&nbsp;&lt;errno.h&gt; <BR>#include&nbsp;&lt;stdio.h&gt; 
            <BR>#include&nbsp;&lt;stdlib.h&gt; 
            <BR>#include&nbsp;&lt;string.h&gt; 
            <BR>#include&nbsp;&lt;sys/types.h&gt; 
            <BR>#include&nbsp;&lt;sys/ipc.h&gt; 
            <BR>#include&nbsp;&lt;sys/shm.h&gt; <BR><BR>typedef&nbsp;struct 
            <BR>{ <BR>int&nbsp;tc_number; <BR>char&nbsp;ap_name[5]; 
            <BR>char&nbsp;mymessage[20]; <BR><BR>}&nbsp;COMM_TABLE; 
            <BR><BR>main() <BR>{ <BR><BR>/*&nbsp;local&nbsp;variables&nbsp;*/ 
            <BR>int&nbsp;ret=&nbsp;0; <BR>key_t&nbsp;key; <BR>int&nbsp;i; 
            <BR>int&nbsp;shm_id; <BR>int&nbsp;found&nbsp;=&nbsp;0; 
            <BR>COMM_TABLE&nbsp;*comm_reg; <BR>char&nbsp;*&nbsp;pointer; 
            <BR><BR><BR>key&nbsp;=&nbsp;ftok(".",'w'); 
            <BR><BR>/*&nbsp;share&nbsp;memory&nbsp;has&nbsp;been&nbsp;created&nbsp;*/ 
            <BR>if&nbsp;((shm_id&nbsp;=&nbsp;shmget(key&nbsp;,&nbsp;sizeof(COMM_TABLE),0))&nbsp;==&nbsp;-1) 
            <BR>{ <BR>printf("error&nbsp;=&nbsp;%d\n",&nbsp;errno); 
            <BR>return&nbsp;(ret); <BR><BR>} 
            <BR>comm_reg&nbsp;=&nbsp;(COMM_TABLE&nbsp;*)&nbsp;shmat(shm_id,&nbsp;(char&nbsp;*)&nbsp;0,&nbsp;SHM_SHARE_MMU); 
            <BR>printf("tc&nbsp;number=%d!!!\n",&nbsp;comm_reg-&gt;tc_number); 
            <BR><BR>/*&nbsp;kill&nbsp;share&nbsp;memory&nbsp;*/ 
            <BR><BR>shmctl(shm_id,IPC_RMID,0); 
            <BR>exit(0);[/code:1:d22bc4f5e9]<BR><BR></TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD align=middle><SMALL>【<A 
      href="http://bbs.chinaunix.net/forum/posting.php?mode=reply&amp;t=240959">发表回复</A>】【<A 
      href="http://bbs.chinaunix.net/forum/viewtopic.php?t=240959">查看CU论坛原帖</A>】【<A 
      href="http://bbs.chinaunix.net/forum/favorites.php?mode=add&amp;t=240959">添加到收藏夹</A>】【<A 
      href="javascript:window.close()">关闭</A>】</SMALL> </TD></TR></TBODY></TABLE><!-----------回复----------->
<TABLE border=0 cellPadding=0 cellSpacing=0 width="75%">
  <TBODY>
  <TR>
    <TD bgColor=#edf0f5>
      <TABLE align=center border=0 cellPadding=0 cellSpacing=0 
      style="BORDER-COLLAPSE: collapse; WORD-BREAK: break-all" width="90%">
        <TBODY>
        <TR>
          <TD>
            <HR>
            <SMALL>&nbsp;<A 
            href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&amp;u=6759" 
            target=_blank>unixbaby</A> 回复于:2004-01-10 18:16:26</SMALL></TD></TR>
        <TR>
          <TD>good<BR><BR></TD></TR>
        <TR>
          <TD>
            <HR>
            <SMALL>&nbsp;<A 
            href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&amp;u=114120" 
            target=_blank>unix_sco</A> 回复于:2004-01-10 21:21:08</SMALL></TD></TR>
        <TR>
          <TD>顶<BR><BR></TD></TR>
        <TR>
          <TD>
            <HR>
            <SMALL>&nbsp;<A 
            href="http://bbs.chinaunix.net/forum/profile.php?mode=viewprofile&amp;u=56198" 
            target=_blank>newince</A> 回复于:2004-01-15 09:43:26</SMALL></TD></TR>
        <TR>
          <TD>天书啊!<BR><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="75%">
  <TBODY>
  <TR>
    <TD bgColor=#49ade9 colSpan=5 height=2 width="100%"><IMG height=1 
      src="ChinaUnix_net - UNIX进程之间的通信.files/bline.gif" 
width=1></TD></TR></TBODY></TABLE><BR><SMALL>Copyright &copy; ChinaUnix.net 
<BR>&nbsp;*&nbsp; 请尊重我们的劳动,转载请注明出自<A 
href="http://www.chinaunix.net/">ChinaUnix.net</A>及作者名 &nbsp;*&nbsp; 
</SMALL></CENTER></DIV></BODY></HTML>

⌨️ 快捷键说明

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