今天做了一个 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]中读信息。
阅读(783) | 评论(0) | 转发(0) |