如何在命名管道中按 ctr+c 后保持程序未关闭?

How to keep program unclosed after ctr+c in named pipe?

我有 2 个程序。 一个是服务器,一个是客户端。客户端向服务器发送字符串,服务器将字符串和 return 交换给客户端。 我遇到的问题是当我按下 ctr+c 时程序(客户端)关闭。(我正在使用线程,因为我一直在要求。)

那么ctr+c后如何保持程序未关闭呢?

点击进入后,这是正确的结果,正在等待服务器。

输入ctl+c时程序关闭,无法运行server.c

客户端.

    #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#define MAX_BUF 1024
// client
int main()
{
  int fd;
  char *myfifo = "myfifo";
  char str[MAX_BUF];

  printf("Input string: ");
  fgets(str, MAX_BUF, stdin);
  str[strlen(str) - 1] = '[=10=]';

  if (mkfifo("myfifo", 0777) == -1)
  {
    if (errno != EEXIST)
    {
      printf("Could not create fifo file\n");
      return 1;
    }
  }

  /* create the FIFO (named pipe) */
  fd = open(myfifo, O_WRONLY);
  if (fd == -1)
    return 2;
  if (write(fd, str, MAX_BUF) == -1)
    return 3;
  close(fd);

  fd = open(myfifo, O_RDONLY);
  read(fd, str, MAX_BUF);
  printf("%s\n", str);
  /* remove the FIFO */
  unlink(myfifo);

  return 0;
}

服务器

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include <pthread.h>

#define MAX_BUF 1024
// server

// creatring struct for saving data
typedef struct thread_data
{
  char str[MAX_BUF];
  int result;

} thread_data;
// the
void *routine(void *arg)
{
  int fd[2];
  char *myfifo = "myfifo";
  thread_data *tdata = (thread_data *)arg;
  if (!(strcmp(tdata->str, "exit")))
    tdata->result = 1; // is exit
  else
    tdata->result = 0; // not exit
  if (tdata->result == 1)
  {
    fd[1] = open(myfifo, O_WRONLY);
    write(fd[1], "Done", sizeof(MAX_BUF));
    close(fd[1]);
  }
  else
  {
    char string[MAX_BUF] = {0};
    char c = 0;
    int length = 0, i = 0;

    length = strlen(tdata->str);
    printf("\nBefore Swap : %s\n", tdata->str);

    for (i = 0; i < length / 2; i++)
    {
      c = tdata->str[i];
      tdata->str[i] = tdata->str[length - 1 - i];
      tdata->str[length - 1 - i] = c;
    }
    printf("\nAfter Swap String : %s\n", tdata->str);
    fd[1] = open(myfifo, O_WRONLY);
    write(fd[1], tdata->str, sizeof(MAX_BUF));
    close(fd[1]);
  }
  pthread_exit(NULL);
}

int Calculation()
{
  int fd[2];
  // fd[0] read
  // fd[1] write
  char *myfifo = "myfifo";
  char buf[MAX_BUF];

  /* open, read, and display the message from the FIFO */
  fd[0] = open(myfifo, O_RDONLY);
  if(fd[0]==-1)
  return 4;
  if(read(fd[0], buf, MAX_BUF)==-1)
  return 5;
  close(fd[0]);

  // res
  int result;
  thread_data tdata;
  strcpy(tdata.str, buf);

  pthread_t t1;
  if (pthread_create(&t1, NULL, &routine, (void *)&tdata) != 0)
  {
    return 1;
  }
  if (pthread_join(t1, NULL) != 0)
  {
    return 2;
  }
}

int main()
{
  int res = Calculation();
  return res;
}

To avoid closing a program you should capture and manage the signal sent by CTRL + C, that is SIGINT, I have modified the code so that it captures the signal CTRL + C

#include  <signal.h> 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#define MAX_BUF 1024
// client

int main()
{
   signal(SIGINT,SIG_IGN); // Register signal handler for ignoring the signal
  int fd;
  char *myfifo = "myfifo";
  char str[MAX_BUF];

  printf("Input string: ");
  fgets(str, MAX_BUF, stdin);
  str[strlen(str) - 1] = '[=10=]';

  if (mkfifo("myfifo", 0777) == -1)
  {
    if (errno != EEXIST)
    {
      printf("Could not create fifo file\n");
      return 1;
    }
  }

  /* create the FIFO (named pipe) */
  fd = open(myfifo, O_WRONLY);
  if (fd == -1)
    return 2;
  if (write(fd, str, MAX_BUF) == -1)
    return 3;
  close(fd);

  fd = open(myfifo, O_RDONLY);
  read(fd, str, MAX_BUF);
  printf("%s\n", str);
  /* remove the FIFO */
  unlink(myfifo);

  return 0;
}