unix domain IPC 进程间通信简析
Linux系统有多种进程间通信方式,如信号、消息队列、管道等,socket是其中一种,socket使用unix domain 模式进行进程间通信
//服务端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define UNIX_SERV "/tmp/unix_serv" //文件路径名
int main(void)
{
int sock_fd;
struct sockaddr_un serv;
struct sockaddr_un cli;
int ret;
socklen_t serv_len;
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0); //采用数据报协议
if(sock_fd < 0)
{
perror("fail to socket");
}
unlink(UNIX_SERV); //若文件 存在,则删除
memset(&serv, 0, sizeof(serv));
serv.sun_family = AF_UNIX; //Unix
strncpy(serv.sun_path, UNIX_SERV, sizeof(serv.sun_path)-1); //拷贝文件名
serv_len = sizeof(serv);
ret = bind(sock_fd, (struct sockaddr *)&serv, serv_len); //服务器需要绑定
if(ret == -1)
{
perror("fail to bind");
}
int recv_size;
char buf[1024];
socklen_t cli_len;
memset(&cli, 0, sizeof(cli));
cli_len = sizeof(cli);
while(1)
{
recv_size = recvfrom(sock_fd, buf, sizeof(buf), 0,
(struct sockaddr *)&cli, &cli_len);
if(recv_size > 0)
{
if(strncmp(buf, "exit", strlen("exit") ) == 0)
{
printf("client exit\n");
break;
}
buf[recv_size-1] = '\0';
printf("recv buf:%s from client\n", buf);
}
}
close(sock_fd);
unlink(UNIX_SERV);
return 0;
}
//客户端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define UNIX_SERV "/tmp/unix_serv" //服务端文件名
//注:客户端代码可以不绑定地址,如不绑定,则不需要客户端文件名;绑定客户端会生成客户端文件
#define UNIX_CLI "/tmp/unix_cli" //客户端文件名
int main(void)
{
int sock_fd;
struct sockaddr_un serv;
struct sockaddr_un cli;
int ret;
socklen_t serv_len;
socklen_t cli_len;
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
if(sock_fd < 0)
{
perror("fail to socket");
}
unlink(UNIX_CLI);
memset(&cli, 0, sizeof(cli));
memset(&serv, 0, sizeof(serv));
cli_len = sizeof(cli);
cli.sun_family = AF_UNIX;
strncpy(cli.sun_path, UNIX_CLI, sizeof(cli.sun_path)-1);
serv_len = sizeof(serv);
serv.sun_family = AF_UNIX;
strncpy(serv.sun_path, UNIX_SERV, sizeof(serv.sun_path)-1);
ret = bind(sock_fd, (struct sockaddr *)&cli, cli_len);
if(ret == -1)
{
perror("fail to bind");
}
int read_size;
int send_size;
char buf[1024];
while(1)
{
read_size = read(STDIN_FILENO, buf, sizeof(buf));
if(read_size > 0)
{
send_size = sendto(sock_fd, buf, read_size, 0,
(struct sockaddr *)&serv, serv_len);
if(serv_len > 0)
{
if(strncmp(buf, "exit", 4) == 0)
{
printf("client exit\n");
break;
}
buf[read_size-1] = '\0';
printf("send buf: %s\n", buf);
}
}
}
close(sock_fd);
unlink(UNIX_CLI);
return 0;
}
unix domain IPC 进程间通信简析的更多相关文章
- PHP 调用 Go 服务的正确方式 - Unix Domain Sockets
* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...
- Unix domain socket IPC
UNIX Domain socket 虽然网络socket也可用于同一台主机的进程间通讯(通过lo地址127.0.0.1),但是unix domain socket用于IPC更有效率:不需要经过网络协 ...
- 【Unix编程】进程间通信(IPC)
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息.IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存储.Socket. ...
- Linux下的IPC-UNIX Domain Socket【转】
本文转载自:http://blog.csdn.net/guxch/article/details/7041052 一. 概述 UNIX Domain Socket是在socket架构上发展起来的用于同 ...
- 由一个简单需求到Linux环境下的syslog、unix domain socket
本文记录了因为一个简单的日志需求,继而对linux环境下syslog.rsyslog.unix domain socket的学习.本文关注使用层面,并不涉及rsyslog的实现原理,感兴趣的读者可以参 ...
- Unix domain socket 简介
Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信.socket 原本是为网络通讯设 ...
- Unix domain socket
转载:http://www.cnblogs.com/chekliang/p/3222950.html socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是 ...
- 【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)
原文:http://blog.csdn.net/zhang197093/article/details/78143687?locationNum=6&fps=1 --------------- ...
- Envoy 基础教程:使用 Unix Domain Socket(UDS) 与上游集群通信
Envoy Proxy 在大多数情况下都是作为 Sidecar 与应用部署在同一网络环境中,每个应用只需要与 Envoy(localhost)交互,不需要知道其他服务的地址.然而这并不是 Envoy ...
随机推荐
- img 的 align 属性
AbsBottom 图像的下边缘与同一行中最大元素的下边缘对齐. AbsMiddle 图像的中间与同一行中最大元素的中间对齐. Baseline 图像的下边缘与第一行文本的下边缘对齐. Bottom ...
- 【JavaScript】标签样式中多出了element.style
是因为使用了js增加或修改了样式.
- 【linux】 linux gpio操作
欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...
- 如何设置ssh安全只允许用户从指定的IP登陆
原文链接: 如何设置ssh安全只允许用户从指定的IP登陆 由于开发上传文件需要 在服务器上开启 允许用户名和密码ssh登录.这样不太安全.百度后参考文章现在ssh用户名和密码登录的ip. 登录服务 ...
- Verilog中的标点
在Verilog中有时候会误用的上引号 1,define 中的 `define INITIAL 0 这个单引号用的是键盘左上角的那个单引号,其实就是一个小撇. 2,4'd0 这个 用的是才是叫真正的 ...
- 基于visual Studio2013解决算法导论之043单源最短路径dijstra矩阵
题目 单源最短路径dijstra矩阵 解决代码及点评 // 26单源最短路径dijstra矩阵.cpp : 定义控制台应用程序的入口点. // #include <iostream> ...
- java困惑(二)函数以及引用改变
具体的Visio 文档在资源
- A Magic Lamp(贪心+链表)
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- UNIX环境高级编程——进程管理和通信(总结)
进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程 动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合 是个文件,可直观看到 程序program ...
- 自定义安装Apache+php+mysql网站服务器环境
自定义安装Apache+php+mysql 这种方式是比较麻烦的安装方式,需要具有一定的对Apache了解的基础上才能安装,安装顺序就是先安装Apache软件,然后安装php,最后安装mysql.这里 ...