Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3350362
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: LINUX

2010-07-05 16:21:06

今天做了一个 socketpair() 函数的测试,这个测试是为两个进程间通讯使用的。

测试的原代码如下:

  1 /*
  2  * =====================================================================================
  3  *
  4  *       Filename:  sockpair.c
  5  *
  6  *    Description:  test socketpair
  7  *
  8  *        Version:  1.0
  9  *        Created:  07/05/2010 10:08:33 AM
 10  *       Revision:  none
 11  *       Compiler:  gcc
 12  *
 13  *         Author:  lgr (mn), garry.lgr@gmail.com
 14  *        Company:  quanshi.com
 15  *
 16  * =====================================================================================
 17  */
 18
 19
 20 #include
 21 #include
 22 #include
 23 #include
 24 #include
 25
 26 int main(int argc, char *argv[])
 27 {
 28
 29     int sv[2];
 30     int ret = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
 31     char msg1[10]="ccccc";
 32     char msg2[10]="ddddd";
 33     char rcvbuf1[20] = {0,};
 34     char rcvbuf2[20] = {0,};
 35
 36     if(fork()){
 37
 38         // this is a parent process
 39         printf("entry parent process! \n");
 40         //write(sv[0], msg1, strlen(msg1) + 1); 
 41         close(sv[0]);
 42         write(sv[1], msg2, strlen(msg2) + 1);
 43
 44         sleep(1);
 45
 46         int len=0;
 47         if((len = read(sv[0], rcvbuf1,10))>0){
 48           printf("parent read1 msg is :%s\n", rcvbuf1);
 49         }
 50
 51         len = 0;
 52         if((len = read(sv[1], rcvbuf2,20))>0){
 53           printf("parent read2 msg is :%s\n", rcvbuf2);
 54         }
 55
            close(sv[1]);
 56         return 0;
 58     }
 59     else{
 60
 61         printf("entry child process!\n");
 62         close(sv[1]);
 63
 64         // this is a child process
 65         int len=0;
 66         if((len = read(sv[1], rcvbuf2, 10)) >0){
 67           printf("child msg1 is :%s\n", rcvbuf2);
 68         }
 69
 70         len=0;
 71         if((len = read(sv[0], rcvbuf1, 10)) >0){
 72           printf("child msg2 is :%s\n", rcvbuf1);
 73         }
 74
 75         //write(sv[1], msg1, strlen(msg1)+1); 
 76         write(sv[0], msg2, strlen(msg2)+1);
 77
            close(sv[0]);
 78         return 0;
 79
 80     }
 81
 82
 83     return 0;
 84
 85 }

结论:
1. socketpair 产生两个文件描述符 sv[0] 和 sv[1].
2. 在两个进程间进行通讯时,sv[0]与别一个进程的sv[1]组成一对。这样就形成了两个通道。它们分别为
   parent sv[0] -----  child sv[1]
   parent sv[1] -----  child sv[0]
3. 每一个通道都是全双工的。即你可以向 parent sv[0]写入信息,从 child sv[1]中读数据。也可以 向 child sv[1]写入信息,从 parent sv[0]中读信息。

阅读(753) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~