【问题标题】:Ending terminal application on mac + cleanup process在 mac + 清理过程中结束终端应用程序
【发布时间】:2021-10-31 01:18:29
【问题描述】:

我正在尝试创建一个在 main 方法(多线程应用程序)中具有无限循环的 c 程序。我们在两个应用程序之间使用 pthreads 和 POSIX 共享内存。如果我使用命令行 (CTL+C) 退出其中一个程序,那么我想运行一种清理方法来清理所有分配的内存并删除 POSIX 共享内存映射。

int main () {
    for (;;)
    {
    }
    
        destroy_shared_object(shm, MEM_MAP_SIZE);
        exit(EXIT_SUCCESS);
        return 0;
}

现在这就是我上面的内容,但是当我退出程序时,我认为它不会删除共享内存映射并进行清理。任何帮助将不胜感激!

【问题讨论】:

  • 您可以使用signal() 捕获CTRL+C

标签: c posix shared-memory


【解决方案1】:

您可以使用signal() 处理程序捕获CTRL+C,并在信号处理程序中设置标志变量:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

static volatile sig_atomic_t running = 1;

void sighandler(int signum) {
   running = 0;
}

int main() {
   signal(SIGINT, sighandler);

   while(running) {
      sleep(1); 
   }

   printf("Do the cleanup...\n");

   return 0;
}

编辑:

改用sigaction() 可能会更好:

  WARNING: the behavior of signal() varies across UNIX versions,
  and has also varied historically across different versions of
  Linux.  Avoid its use: use sigaction(2) instead.  See > Portability
  below.

【讨论】:

  • 您答案中的代码很危险。您在 sighandler 中调用的函数都不是异步信号安全的。
  • @JosephSible-ReinstateMonica 谢谢!我已经调整了答案,希望现在安全。
  • 更好,但仍然略有错误。您的bool 需要更改为sig_atomic_t
  • @JosephSible-ReinstateMonica 好的:D 谢谢,不知道有一个用于原子整数类型的 typedef(在信号处理的上下文中)。
猜你喜欢
  • 2018-08-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 2023-03-14
  • 2014-12-16
相关资源
最近更新 更多