一.序
在上一篇博客有名管道及其实例一的基础上,对程序进行修改,使得按下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 256
void 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=gcc
OUT=-o
all:server client
server:server.c
$(CC) server.c $(OUT) server
client:client.c
$(CC) client.c $(OUT) client
.PHONY:clean
clean:
/bin/rm -f server client