Linux系统编程:客户端-服务器用FIFO进行通信
先放下代码 回来在解释
头文件:
clientinfo.h
struct CLIENTINFO{
char myfifo[];
int leftarg;
int rightarg;
char op;
};
typedef struct CLIENTINFO CLIENTINFO, *CLINTINFOPTR;
client.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#include "clientinfo.h" #define FIFO_NAME "/home/levi/chatapplication/data/server_fifo/chat_server_fifo"
#define BUFF_SZ 100 char mypipename[BUFF_SZ];
void handler(int sig){
unlink(mypipename);
exit();
} int main(int argc, char const *argv[])
{
int res;
int fifo_fd, my_fifo;
int fd;
CLIENTINFO info;
char buffer[BUFF_SZ]; signal(SIGKILL, handler);
signal(SIGINT, handler);
signal(SIGTERM, handler); if(argc != ){
printf("Usage: %s op1 operation op2\n", argv[]);
exit();
}
if(access(FIFO_NAME, F_OK) == -){
printf("Could not open FIFO %s\n", FIFO_NAME);
exit(EXIT_FAILURE);
}
fifo_fd = open(FIFO_NAME, O_WRONLY);
if(fifo_fd == -){
printf("Could not open %s for write access\n", FIFO_NAME);
exit(EXIT_FAILURE);
}
sprintf(mypipename, "/home/levi/chat_client_%d_fifo", getpid());
res = mkfifo(mypipename, );
if(res != ){
printf("FIFO %s was not created\n", buffer);
exit(EXIT_FAILURE);
} my_fifo = open(mypipename, O_RDONLY | O_NONBLOCK);
if(my_fifo == -){
printf("Could not open %s for read only access\n", FIFO_NAME);
exit(EXIT_FAILURE);
} strcpy(info.myfifo, mypipename);
info.leftarg = atoi(argv[]);
info.op = argv[][];
info.rightarg = atoi(argv[]); write(fifo_fd, &info, sizeof(CLIENTINFO));
close(fifo_fd); memset(buffer, '\0', BUFF_SZ);
while(){
res = read(my_fifo, buffer, BUFF_SZ);
if(res > ){
printf("Received from server : %s\n", buffer);
break;
}
}
printf("Client %d is terminating\n", getpid());
close(my_fifo);
(void)unlink(mypipename);
return ;
}
server.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#include "clientinfo.h" #define FIFO_NAME "/home/levi/server_fifo/chat_server_fifo"
void handler(int sig){
unlink(FIFO_NAME);
exit();
} int calc(CLIENTINFOPTR info){
switch(info->op){
case '+' : return info->leftarg + info->rightarg;
case '-' : return info->leftarg - info->rightarg;
case '*' : return info->leftarg * info->rightarg;
case '/' : return info->leftarg / info->rightarg;
}
return ;
} int main(int argc, char const *argv[])
{
int res, i, fifo_fd, fd1;
CLIENTINFO info;
char buffer[];
signal(SIGKILL, handler);
signal(SIGINT, handler);
signal(SIGTERM, handler);
if(access(FIFO_NAME, F_OK) == -){
res = mkfifo(FIFO_NAME, );
if(res != ){
printf("FIFO %s was not created\n", FIFO_NAME);
exit(EXIT_FAILURE);
}
}
fifo_fd = open(FIFO_NAME, O_RDONLY);
if(fifo_fd == -){
printf("Could not open %s for read only access\n", FIFO_NAME);
exit(EXIT_FAILURE);
}
printf("\nServer is rarin to go !\n");
while(){
res = read(fifo_fd, &info, sizeof(CLIENTINFO));
if(res != ){
printf("Client arrived!!\n");
sprintf(buffer, "The result is %d", calc(&info));
fd1 = open(info.myfifo, O_WRONLY | O_NONBLOCK);
write (fd1, buffer, strlen(buffer) + );
close(fd1);
} }
return ;
}
OK!
./server.c &
./client 3 + 5
看输出吧!
Linux系统编程:客户端-服务器用FIFO进行通信的更多相关文章
- Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道
Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...
- Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...
- Linux 系统编程 学习:04-进程间通信2:System V IPC(1)
Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...
- Linux 系统编程 学习:05-进程间通信2:System V IPC(2)
Linux 系统编程 学习:05-进程间通信2:System V IPC(2) 背景 上一讲 进程间通信:System V IPC(1)中,我们介绍了System IPC中有关消息队列.共享内存的概念 ...
- Linux 系统编程 学习 总结
背景 整理了Liunx 关于 进程间通信的 很常见的知识. 目录 与 说明 Linux 系统编程 学习:000-有关概念 介绍了有关的基础概念,为以后的学习打下基础. Linux 系统编程 学习:00 ...
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- Linux系统编程温故知新系列 --- 01
1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...
- Linux 系统编程 学习:06-基于socket的网络编程1:有关概念
Linux 系统编程 学习:006-基于socket的网络编程1:有关概念 背景 上一讲 进程间通信:System V IPC(2)中,我们介绍了System IPC中关于信号量的概念,以及如何使用. ...
- Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信
Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信 背景 上一讲我们介绍了网络编程的一些概念.socket的网络编程的有关概念 这一讲我们来看UDP 通信. 知识 U ...
随机推荐
- vimer
vimer 第1.0章.统一概念 不管学什么技术,我都深信概念是最重要的.是影响整个学习轨迹,决定能在这个技术领域高度. 当然如果你现在的目的不是在学习而在于解决问题(很多人不愿意承认,或者没发现 ...
- HTML5游戏开发引擎Pixi.js完全入门手册(一)框架简介及框架结构分析,作者思路剖析
前言: 最近无聊在淘宝弄了个小店,打算做一个兼职.遇到一个客户,要我帮忙拷贝一个html5游戏.. 我这人有一个习惯,拿到自己没见过的东西.都会去研究一番.去网上查了下发现,资料都是英文版.感觉极度不 ...
- 微软将彻底改变Windows发布方式
看到网上的新闻信息: 微软上任 CEO 史蒂夫·鲍尔默在职最后一段时间引入了更快的产品公布周期.不再向从前那样,每隔几年公布一次重大产品升级,而是功能一旦开发完成就会推送升级. 显然,现任 CEO 纳 ...
- 照片详细解释YUV420数据格式
YUV格式有两大类:planar和packed. 对于planar的YUV格式.先连续存储全部像素点的Y.紧接着存储全部像素点的U.随后是全部像素点的V. 对于packed的YUV格式,每一个像素点的 ...
- Jquery实现 TextArea 文本框根据输入内容自动适应高度
原文 Jquery实现 TextArea 文本框根据输入内容自动适应高度 在玩微博的时候我们可能会注意到一个细节就是不管是新浪微博还是腾讯微博在转发和评论的时候给你的默认文本框的高度都不会很高,这可能 ...
- jQuery UI的datepicker日期控件如何让他显示中文
首先是引入UI的JS文件和模板文件,如下: <link rel=”stylesheet” href=”./ui/themes/le-frog/jquery.ui.all.css”> < ...
- 【翻译】C#和.NET核心快速参考
原文:[翻译]C#和.NET核心快速参考 PS:在网上看到的一篇C#总结,英文的,总结的还可以,都是基础知识,翻译给大家学习.文章结尾有英文原版.发布地址:http://www.cnblogs.com ...
- CSharp设计模式读书笔记(8):桥接模式(学习难度:★★★☆☆,使用频率:★★★☆☆)
桥接模式(Bridge Pattern): 将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模 ...
- veridata实验举例(2)验证表BONUS与表SALGRADE两节点同步情况
veridata实验举例(2)验证表BONUS与表SALGRADE两节点同步情况 续接前几篇文章: 1.GoldenGate配置(一)之单向复制配置 地址:点击打开链接 2.GoldenGate配置( ...
- TLD跟踪算法优化(一)并行化
才学疏浅,仅仅言片语,仅仅求志同道的朋友一起交流研究. 并行化不算是算法的改进,仅仅是追求执行的实时性. 简要列举一个样例: TLD算法的C++版本号源代码里: LKTracker::trackf2f ...