linux 本地通信 socketpair 的使用

							linux 本地通信 socketpair 的使用

linux 下本地通信的方式有多种,此次介绍socketpair的使用。
函数原型:
NAME
socketpair - create a pair of connected sockets

SYNOPSIS
#include

   int socketpair(int domain, int type, int protocol,
          int socket_vector[2]);

调用socketpair后会将通信的嵌套字两端存储于socket_vector数组中,通过两个socket嵌套字可以在同一个进程中通信,也可以在有亲缘关系的进程或者线程中使用。简单实现了父子进程间通信,传递的参数交替累计的功能,废话不再多说,上代码:

#include 
#include 
#include 
#include 
#include 
/*
       int socketpair(int domain, int type, int protocol,
              int socket_vector[2]);
*/


int main(int argc,char *argv[])
{
	int sv[2];

	if(socketpair(PF_UNIX,SOCK_STREAM,0,sv) < 0)
	{
		perror("create socketpair");
		exit(0);
	}
	pid_t pid = fork();
	switch(pid)
	{
		case -1:
			return -1;
			break;
		case 0: 
			{
				int val = 0;
				close(sv[1]);  ///close socket reference
				while(1)
				{
					read(sv[0],&val,sizeof(val));
					printf("child read:%d\r\n",val);
					val ++;
					write(sv[0],&val,sizeof(val));

					if(val > 10)
					{
						close(sv[0]);
						break;
					}
				} 
			}
			break;
		default :
			{
				int val1 = 0;
				close(sv[0]); ///close socket reference
				while(1)
				{
					val1 ++;
					write(sv[1],&val1,sizeof(val1));
					read(sv[1],&val1,sizeof(val1));
					printf("parent read:%d\r\n",val1);
					if(val1 > 10)
					{
						printf("test \r\n");
						close(sv[1]);
						break;
					}
				}
			}
			break;				
	}

	printf("quit local socket communicaion\r\n");
	return 0;
}

result:
child read:1
parent read:2
child read:3
parent read:4
child read:5
parent read:6
child read:7
parent read:8
child read:9
parent read:10
child read:11
parent read:12
test
quit local socket communicaion
quit local socket communicaion

小结:在socket 通信中 read 无数据时 默认会堵塞,作为socket 两端,sv[0] 与 sv[1] 在这一端写,则是在另一端可读,无数据则堵塞,个人感觉socketpair 本地通信实用性不强,此文仅做学习使用,后期会更新socket 通过文件在本地通信,可用于无亲缘关系的进程线程间通信,项目中实用性更好

你可能感兴趣的:(linux,linux,socketpai,socket)