有名なパイプとその例2——補足捕捉信号ctrl+c機能


一.前編のブログの有名なパイプとその実例1に基づいて、ctrl+cを押してプログラムを終了すると、確立した2つのFIFO 2を削除できるようにプログラムを修正する.コード補完は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
#include
#include 
#include 
#include 
#include
#include
#include

#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
"
, 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
"
, 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