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 进程间通信简析的更多相关文章

  1. PHP 调用 Go 服务的正确方式 - Unix Domain Sockets

    * { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...

  2. Unix domain socket IPC

    UNIX Domain socket 虽然网络socket也可用于同一台主机的进程间通讯(通过lo地址127.0.0.1),但是unix domain socket用于IPC更有效率:不需要经过网络协 ...

  3. 【Unix编程】进程间通信(IPC)

    进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息.IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存储.Socket. ...

  4. Linux下的IPC-UNIX Domain Socket【转】

    本文转载自:http://blog.csdn.net/guxch/article/details/7041052 一. 概述 UNIX Domain Socket是在socket架构上发展起来的用于同 ...

  5. 由一个简单需求到Linux环境下的syslog、unix domain socket

    本文记录了因为一个简单的日志需求,继而对linux环境下syslog.rsyslog.unix domain socket的学习.本文关注使用层面,并不涉及rsyslog的实现原理,感兴趣的读者可以参 ...

  6. Unix domain socket 简介

    Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信.socket 原本是为网络通讯设 ...

  7. Unix domain socket

    转载:http://www.cnblogs.com/chekliang/p/3222950.html socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是 ...

  8. 【转】PHP实现系统编程(四)--- 本地套接字(Unix Domain Socket)

    原文:http://blog.csdn.net/zhang197093/article/details/78143687?locationNum=6&fps=1 --------------- ...

  9. Envoy 基础教程:使用 Unix Domain Socket(UDS) 与上游集群通信

    Envoy Proxy 在大多数情况下都是作为 Sidecar 与应用部署在同一网络环境中,每个应用只需要与 Envoy(localhost)交互,不需要知道其他服务的地址.然而这并不是 Envoy ...

随机推荐

  1. ExtJS4.2 - 从 Hello World 到 自定义组件 -01 (为爱女伊兰奋斗)

    ExtJS4.2 - 从 Hello World 到 自定义组件 - 01 经验.概述.项目搭建.国际化.HelloWorld.布局 —— 为爱女伊兰而奋斗 ——少走弯路,简单才是王道 1. 写在前面 ...

  2. likely() and unlikely()

    likely() and unlikely() http://www.cnblogs.com/yangzd/archive/2010/09/27/1837202.html 在linux中判断语句经常会 ...

  3. Oracle 游标疑问

    procedure1: CREATE OR REPLACE PROCEDURE UPDATE_AC02_AAE140_WYL(PI_AAB001 IN NUMBER, PO_FHZ OUT VARCH ...

  4. HDU 3068 最长回文 【最长回文子串】

    和上一题一样,不过这题只是要求最长回文子串的长度 在此采用了非常好用的Manacher算法 据说还是O(n) 的效率QAQ 详细用法参考了上篇博客的参考资料,这两天有空学习一下~ Source cod ...

  5. OGR SQL

    The OGRDataSource supports executing commands against a datasource via the OGRDataSource::ExecuteSQL ...

  6. UVA 10340 (13.08.25)

    Problem E All in All Input: standard input Output: standard output Time Limit: 2 seconds Memory Limi ...

  7. Website 内容管理

    公司网站后是这样的. 用的是中企动力的,后台还是比较好管理的.所以不多说什么了.

  8. SGU 106 The Equation 扩展欧几里得应用

    Sol:线性不定方程+不等式求解 证明的去搜下别人的证明就好了...数学题. #include <algorithm> #include <cstdio> #include & ...

  9. redis安装及数据类型简介(string、list、set、sorted_set、hash)

    一:简介: redis国内最大的案例--->新浪微博 memcache:是key-value数据库 数据类型:只支持key value数据 过期策略:支持 持久化:不支持(可以通过三方程序) 主 ...

  10. Jquery学习笔记:事件处理基础介绍

    一.引子 给html的元素添加一个响应事件,最简单的办法是直接在元素标签内填写事件属性,先看一个最简单的例子 <!DOCTYPE html> <html lang="zh- ...