有名管道+多进程最基本的并发式的通信
2017-03-11 12:21
441 查看
一.之前的有名管道实现的服务器-客户端程序只能实现你一句我一句的基本的通信。要实现最最基本的并发式通信,需要引入多个进程
真正的并发式通信不再是一个服务器针对一个客户端这种一对一的模式,而是一对多的模式。这里其实还谈不上并发。
二.代码
1.server.c
2.client.c
3.utili.h
4.Makefile
三.代码测试
真正的并发式通信不再是一个服务器针对一个客户端这种一对一的模式,而是一对多的模式。这里其实还谈不上并发。
二.代码
1.server.c
/*并发式,不再是你一句我一句 * QQ聊天 * */ #include"utili.h" int main() { char sendbuf[MAX_MSG_LEN]; char recvbuf[MAX_MSG_LEN]; if(access(FIFO_WRITE, F_OK) == -1) { int res = mkfifo(FIFO_WRITE, 0666);//0表示8进制 if(res == -1) { perror("mkfifo WRITE"); exit(EXIT_FAILURE); } } //以只写方式打开,会阻塞到有读方式打开管道 int wfd = open(FIFO_WRITE, O_WRONLY); if(wfd == -1) { perror("open WRITE"); exit(EXIT_FAILURE); } //以只读方式打开,会阻塞到有写方式打开管道 int rfd = open(FIFO_READ, O_RDONLY); if(rfd == -1) { perror("open READ"); exit(EXIT_FAILURE); } pid_t pid = fork(); if(pid == 0)//子进程负责读入数据 { while(1) { read(rfd, recvbuf, MAX_MSG_LEN); printf("Cli:>%s\n", recvbuf); if(strcmp(recvbuf, "quit") == 0) exit(EXIT_FAILURE); } } else if(pid > 0) { pid_t pid1 = fork(); if(pid1 == 0) { while(1) { printf("Ser:>"); signal(SIGINT, handler); scanf("%s", sendbuf); write(wfd, sendbuf, strlen(sendbuf)+1); } } else if(pid1 > 0) { int stat; wait(&stat); wait(&stat); } } }
2.client.c
#include"utili.h" int main() { char recvbuf[MAX_MSG_LEN]; char sendbuf[MAX_MSG_LEN]; int wfd, rfd; if(access(FIFO_READ, F_OK) == -1) { int res = mkfifo(FIFO_READ, 0666); if(res == -1) { perror("mkfifo READ"); exit(EXIT_FAILURE); } } //server的写对应client读 rfd = open(FIFO_WRITE, O_RDONLY); if(rfd == -1) { perror("open READ"); exit(EXIT_FAILURE); } wfd = open(FIFO_READ, O_WRONLY); if(wfd == -1) { perror("open WRITE"); exit(EXIT_FAILURE); } pid_t pid = fork(); if(pid == 0)//子进程用于写 { while(1) { printf("Cli:>"); scanf("%s", sendbuf); write(wfd, sendbuf, strlen(sendbuf)+1); if(strcmp(sendbuf, "quit") == 0) exit(EXIT_FAILURE); } } else if(pid > 0) { pid_t pid1 = fork(); if(pid1 == 0) { while(1) { read(rfd, recvbuf, MAX_MSG_LEN); printf("Ser:>%s\n", recvbuf); } } else if(pid > 0) { int stat; wait(&stat); wait(&stat); } } }
3.utili.h
#ifndef _UTILI_H_ #define _UTILI_H_ #include<stdio.h> #include<unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<stdlib.h> #include<string.h> #include<signal.h> #include<sys/wait.h> #define FIFO_READ "readfifo" #define FIFO_WRITE "writefifo" #define MAX_MSG_LEN 256 void handler(int signum) { unlink(FIFO_READ); unlink(FIFO_WRITE); exit(1); } #endif
4.Makefile
CC=gcc OUT=-o all:server client server:server.c $(CC) server.c $(OUT) server -std=c99 client:client.c $(CC) client.c $(OUT) client -std=c99 .PHONY:clean clean: /bin/rm -f server client
三.代码测试
相关文章推荐
- linux进程通信----FIFO(有名管道)
- linux进程通信机制之无名管道&有名管道
- Linux进程通信 有名管道实现守护进程
- 利用有名管道实现进程间的通信
- 进程之间通信之有名管道、无名管道(pipe),笔记
- 【进程】进程通信-无名管道,有名管道
- Linux 进程通信(有名管道)
- 简单的实现在有名管道里,进程间的通信(非阻塞)。
- Linux进程间的通信——有名管道fifo与守护进程deamon
- 进程通信-有名管道FIFO
- 多进程间通信之有名管道
- linux进程通信--有名管道
- Linux下的有名管道(06)---使用两个管道实现两个进程之间的通信(手机模式)
- 基本进程通信--管道
- 有名管道在无亲缘进程间的通信
- 进程中通信的‘无名管道’和‘有名管道’的用法和二者的区别
- linux进程通信-有名管道
- Linux下进程的通信方式: 有名管道(命名管道)
- linux中的进程通信-信号量和有名管道
- 进程通信之有名管道