有名管道及其实例二——补充捕捉信号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
原创粉丝点击