0

我想使用 c 创建单边聊天应用程序,当阅读器(客户端)按 Ctrl+c 时,应该关闭编写器(服务器)。但问题是我仍然不知道如何在阅读器按 Ctrl+c 时向编写器发送信号。

请对此提出任何建议...

这是读者端代码:

 #include<fcntl.h>
 #include<stdio.h>
 #include<sys/stat.h>
 #include<sys/types.h>
 #include<unistd.h>
 #include<string.h>
 #include<stdlib.h>
 #include<signal.h>
 #define max 1990
 int fu;
 void sigHadeler();

    int main(){
       struct stat sb;


       int fd;
       char* fifo="/home/man/shellScript/fifo";
       char buf[max];
       struct sigaction new_action, old_action;
       new_action.sa_handler = sigHadeler;
       sigemptyset (&new_action.sa_mask);
       new_action.sa_flags = 0; 
           if( sigaction (SIGINT, NULL, &old_action) == -1) 
         perror("Failed to retrieve old handle"); /Ctrl + C */

     if( sigaction (SIGINT, &new_action, NULL) == -1)/* set the new action */
      ("Failed to set new Handle");

             printf("Start conversation....\n");
      while(1){

     while(1){
       stat(fifo,&sb);

       if((sb.st_mode & S_IFMT)==S_IFIFO){

        fd=open(fifo,O_RDONLY);
        int re =read(fd,buf,max);
        buf[re]='\0';
        printf("read: %s\n",buf);

        close(fd);

    break;
    }
     }

      }

    return 0;
   }

    void sigHadeler(){
    char* fifo="/home/man/shellScript/fifo";
    printf("What have you done \n");
    write(fu,"0",strlen("0"));
    close(fu);
    unlink(fifo);
    exit(1);
    }

这是作者端代码:

#include<fcntl.h>
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#define max 1990

int main(){
    int fd;
    char* input;
    input = malloc(sizeof(char)*1000);
    char* fifo="/home/man/shellScript/fifo";
    printf("Enter string :");
    struct stat sb;
    mkfifo(fifo,0666);

        while(1){

        printf("Writing..\n");
        fgets(input,max,stdin);
        input[strlen(input)-1]='\0';
        fd=open(fifo,O_WRONLY| O_NONBLOCK);
        if(fd<=0){printf("Reader is closed or no readers ...\n");
            exit(1);    
        }

        write(fd,input,strlen(input));
        close(fd);
        while(1){
            stat(fifo,&sb);
            if((sb.st_mode & S_IFMT)==S_IFIFO){
            close(fd);
        }
        break;
    }
    }
unlink(fifo);
return 0;
}
4

0 回答 0