您的位置:首页 > 运维架构 > Linux

linux ipc 进程间通信 共享内存、socket等

2015-05-02 21:45 190 查看
一、基于内存的通信

1、内核共享内存

编程模型:

1.1 创建共享内存,得到一个ID :shmget

2.1 把ID映射成虚拟地址 :shmat

3.1 使用虚拟地址访问内核共享内存 ,使用内存函数与运算符

str**系列函数,mem** 系列等等! 与平时访问内存差不多

3.2 卸载虚拟地址 :shmdt ,

3.3 删除共享内存 :shmctl(修改/获取共享内存的属性:)

共享内存使用,主要就是使用者上面几个函数:shmget , shmat, shmdt , shmctl

使用:

/////////////////////// 创建共享内存 //////////////////////////////////////////////////////

二、socket

1、模型

服务器端:

1.建立socket

2.绑定在地址上(文件目录地址)URL

协议://路径/文件名

file://usr/bin/ls
http://192.168.2.12/index.php
stuct sockaddr

struct sockaddr_un ;un = unix

struct sockaddr_in;in = internet

bind :

3、接收数据:read/write send/recv sendto/recvfrom

4、 关闭socket

客户端:

1、建立socket:socket

2、连接目标:connect

3、发送/接收数据:send、recv recvfrom

4、关闭socket

例子:

@1#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <linux/un.h>

#include <string.h>

#include <unistd.h>

int main()

{

int fd;

struct sockaddr_un addr = {0};

//简历连接

fd = socket(AF_UNIX,SOCK_DGRAM,0);

//连接到指定地址

addr.sun_family = AF_UNIX;

memcpy(addr.sun_path,"my1.sock",strlen("my1.sock"));

int r = 0;

//绑定

r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));

if(r == -1)printf("bind err:%m\n"),exit(-1);

printf("bind 成功!\n");

//发送

char buf[20];

while(1)

{

bzero(buf,sizeof(buf));

r = read(fd,buf,sizeof(buf));

buf[r] =0;

printf("%s\n",buf);

}

//关闭

close(fd);

//删除socket文件

unlink("my1.sock");

}

@2

#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <linux/un.h>

#include <string.h>

#include <unistd.h>

int main()

{

int fd;

struct sockaddr_un addr = {0};

//简历连接

fd = socket(AF_UNIX,SOCK_DGRAM,0);

//连接到指定地址

addr.sun_family = AF_UNIX;

memcpy(addr.sun_path,"my1.sock",strlen("my1.sock"));

int r = 0;

//连接

r = connect(fd,(struct sockaddr*)&addr,sizeof(addr));

//发送

char buf[]= "maomao";

while(1)

{

sleep(1);

write(fd,buf,sizeof(buf)/sizeof(char));

}

//关闭

close(fd);

}

## 1

#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <linux/un.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <netinet/in.h>

int main()

{

int fd;

struct sockaddr_in addr = {0};

//简历连接

fd = socket(AF_INET,SOCK_DGRAM,0);

//连接到指定地址

addr.sin_family = AF_INET;

addr.sin_port = htons(6000);

addr.sin_addr.s_addr =htonl(INADDR_ANY);

int r = 0;

//绑定

r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));

if(r == -1)printf("bind err:%m\n"),exit(-1);

printf("bind 成功!\n");

//发

char buf[20];

while(1)

{

bzero(buf,sizeof(buf));

r = read(fd,buf,sizeof(buf));

buf[r] =0;

printf("%s\n",buf);

}

//关闭

close(fd);

//删除socket文件

unlink("my1.sock");

}

###########2

#include <stdio.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <linux/un.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <netinet/in.h>

int main()

{

int fd;

struct sockaddr_in addr = {0};

//简历连接

fd = socket(AF_INET,SOCK_DGRAM,0);

//连接到指定地址

addr.sin_family = AF_INET;

addr.sin_port = htons(6000);

addr.sin_addr.s_addr = htonl(INADDR_ANY);

int r = 0;

//连接

r = connect(fd,(struct sockaddr*)&addr,sizeof(addr));

//发送

char buf[]= "maomao";

while(1)

{

sleep(1);

write(fd,buf,sizeof(buf)/sizeof(char));

}

//关闭

close(fd);

}

##################################
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: