进程间通信系列 之 管道(客户端和服务端通信)
进程间通信系列 之 概述与对比
http://blog.csdn.net/younger_china/article/details/15808685
进程间通信系列 之 共享内存及其实例
http://blog.csdn.net/younger_china/article/details/15961557
进程间通信系列 之 共享内存简单实例
http://blog.csdn.net/younger_china/article/details/15991081
进程间通信系列 之 信号(理论)
http://blog.csdn.net/younger_china/article/details/15976961
进程间通信系列 之 信号实例
http://blog.csdn.net/younger_china/article/details/15968715
进程间通信系列 之 信号综合实例
http://blog.csdn.net/younger_china/article/details/15980485
进程间通信系列 之 命名管道FIFO及其应用实例
http://blog.csdn.net/younger_china/article/details/15808531
进程间通信系列 之 管道(客户端和服务端通信)
http://blog.csdn.net/younger_china/article/details/15809281
进程间通信系列 之 信号量详解及编程实例
http://blog.csdn.net/younger_china/article/details/15808531
进程间通信系列 之 消息队列函数及其范例
http://blog.csdn.net/younger_china/article/details/15503871
进程间通信系列 之 消息队列应用实例
http://blog.csdn.net/younger_china/article/details/15808501
进程间通信系列 之 socket套接字及其实例
http://blog.csdn.net/younger_china/article/details/15809163
进程间通信系列 之 socket套接字实例
http://blog.csdn.net/younger_china/article/details/15809207
场景描述:
多个客户端同时和服务端进行通信,客户端发送buf至服务端,服务端进程处理。将buf中的英文字母全部转为大写,之后返回给客户端。
实现原理:
服务端以阻塞的方式打开一个命名管道(O_RDONLY),客户端以阻塞的方式打开这个管道(O_WRONLY)并写入数据。
因为是阻塞方式,有数据进行写入,服务端才开始处理。至于是如何同步,是在open的时候处理的。服务端处理之后,将处理后的结果写入对应的客户端的命名管道。
而客户端的管道命名需加上自己的标识。客户端处理完毕之后,关闭自己的客户端管道和服务端管道,删除自己的客户端管道。
头文件如下: client.h
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <limits.h> #include <fcntl.h> #define SERVER_FIFO_NAME "/tmp/serv_fifo" #define CLIENT_FIFO_NAME "/tmp/cli_%d_fifo" #define BUFFER_SIZE 20 struct data_to_pass_st{ pid_t client_pid; char some_data[BUFFER_SIZE-1]; };
服务端代码如下: server.c
#include "client.h" #include <ctype.h> int main(int argc,char **argv) { int server_fifo_fd,client_fifo_fd; struct data_to_pass_st my_data; int read_res; char client_fifo[256]; char *tmp_char_ptr; mkfifo(SERVER_FIFO_NAME,0777); server_fifo_fd = open(SERVER_FIFO_NAME,O_RDONLY); if(server_fifo_fd == -1){ fprintf(stderr,"Server fifo failure!\n"); exit(-1); } sleep(10); do{ read_res = read(server_fifo_fd,&my_data,sizeof(my_data)); if(read_res > 0){ tmp_char_ptr = my_data.some_data; while(*tmp_char_ptr){ *tmp_char_ptr = toupper(*tmp_char_ptr); tmp_char_ptr++; } sprintf(client_fifo,CLIENT_FIFO_NAME,my_data.client_pid); client_fifo_fd = open(client_fifo,O_WRONLY); if(client_fifo_fd != -1){ write(client_fifo_fd,&my_data,sizeof(my_data)); close(client_fifo_fd); } } }while (read_res > 0); close(server_fifo_fd); unlink(SERVER_FIFO_NAME); exit(0); }
客户端代码: client.c
#include "client.h" #include <ctype.h> int main(int argc,char **argv) { int server_fifo_fd,client_fifo_fd; struct data_to_pass_st my_data; int times_to_send; char client_fifo[256]; server_fifo_fd = open(SERVER_FIFO_NAME,O_WRONLY); if(server_fifo_fd == -1){ fprintf(stderr,"Sorry,no server\n"); exit(-1); } my_data.client_pid = getpid(); sprintf(client_fifo,CLIENT_FIFO_NAME,my_data.client_pid); if(mkfifo(client_fifo,0777) == -1){ fprintf(stderr,"Sorry,can't make %s\n",client_fifo); exit(-1); } for(times_to_send = 0;times_to_send < 5;times_to_send++){ sprintf(my_data.some_data,"Hello from %d",my_data.client_pid); printf("%d sent %s, ",my_data.client_pid,my_data.some_data); write(server_fifo_fd,&my_data,sizeof(my_data)); client_fifo_fd = open(client_fifo,O_RDONLY); if(client_fifo_fd != -1){ if(read(client_fifo_fd,&my_data,sizeof(my_data)) > 0){ printf("received: %s\n",my_data.some_data); } close(client_fifo_fd); } } close(server_fifo_fd); unlink(client_fifo); exit(0); }
运行:
./server &
for i in 1 2 3 4 5
do
./client &
done
转自:http://blog.csdn.net/nowdoit/article/details/7092113
posted on 2013-11-13 09:51 YoungerChina 阅读(277) 评论(0) 编辑 收藏 举报