有名管道及其实例二——补充捕捉信号ctrl+c功能
来源:互联网 发布:linux 安装 docker 编辑:程序博客网 时间:2024/04/28 09:58
一.序
在上一篇博客有名管道及其实例一的基础上,对程序进行修改,使得按下ctrl+c退出程序时,可以删除建立的两个FIFO
二.代码补充
只需要在while(1){}这个循环中加入signal(SIGINT, handler)
即可
另外公共头文件加入handler()的实现
void handler(int signum){ unlink(FIFO_READ); unlink(FIFO_WRITE); exit(1);}
三.完整代码
1.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>#define FIFO_READ "readfifo"#define FIFO_WRITE "writefifo"#define MAX_MSG_LEN 256void handler(int signum){ unlink(FIFO_READ); unlink(FIFO_WRITE); exit(1);}#endif
2.server.c
#include"utili.h"int main(){ char sendbuf[MAX_MSG_LEN]; char recvbuf[MAX_MSG_LEN]; int res = mkfifo(FIFO_WRITE, S_IFIFO | 0666); 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); } while(1) { printf("Ser:>"); scanf("%s", sendbuf); signal(SIGINT, handler); if(strcmp(sendbuf, "quit") == 0) { close(wfd); unlink(FIFO_WRITE); close(rfd); exit(EXIT_SUCCESS); } write(wfd, sendbuf, strlen(sendbuf)+1); read(rfd, recvbuf, MAX_MSG_LEN); printf("Cli:>%s\n", recvbuf); }}
3.client.c
#include"utili.h"int main(){ char recvbuf[MAX_MSG_LEN]; char sendbuf[MAX_MSG_LEN]; int wfd, rfd; int res = mkfifo(FIFO_READ, S_IFIFO | 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); } while(1) { read(rfd, recvbuf, MAX_MSG_LEN); printf("Ser:>%s\n", recvbuf); printf("Cli:>"); signal(SIGINT, handler); scanf("%s", sendbuf); if(strcmp(sendbuf, "quit") == 0) { close(rfd); unlink(FIFO_READ); close(wfd); exit(EXIT_SUCCESS); } write(wfd, sendbuf, strlen(sendbuf)+1); }}
4.Makefile文件
CC=gccOUT=-oall:server clientserver:server.c $(CC) server.c $(OUT) serverclient:client.c $(CC) client.c $(OUT) client.PHONY:cleanclean: /bin/rm -f server client
1 0
- 有名管道及其实例二——补充捕捉信号ctrl+c功能
- 有名管道及其实例1
- 事件机制实现超时触发功能,同时捕捉Ctrl+C信号
- 程序:进程间通信——有名管道实例
- 有名管道读写实例
- 有名管道FIFO实例
- 有名管道实例
- java 捕捉信号(linux下的kill,ctrl+c)
- java 捕捉信号(linux下的kill,ctrl+c)
- 管道——(1)有名管道和无名管道
- 进程间通讯——有名管道
- 进程间通讯——管道(有名管道)
- (二十七)进程间通信——fifo有名管道
- Linux信号捕捉及其处理
- Linux下的C语言编程——共享内存及有名管道的使用
- 嵌入式开发第25天(无名管道,有名管道,信号)
- 传统的进程间通信方式 1.无名管道(pipe) 2.有名管道(fifo) 3.信号(signal); 闹钟信号应用实例
- 进程间通信(二)有名管道
- <iostream>和<iostream.h>的区别
- 卷积神经网络(CNN)前向传播算法
- Markdwon
- linux学习第一天(2017-03-07)1.1-1.3.12
- 匿名函数lambda
- 有名管道及其实例二——补充捕捉信号ctrl+c功能
- USACO2017JanuaryPlatinum Promotion Counting(奶牛升职计数)
- 专用烧写编程器的排故
- 阿里在线编程,去除三个元素,四等分数组问题!
- 解决Linux修改环境变量后导致登录循环进不去系统的问题
- 第五届蓝桥杯【省赛试题4】史丰收速算
- oracle中select 执行步骤
- Netty中ByteBuf对象的创建方式对内存的影响
- Arduino 整型转字符型