c - C 中的信号处理

标签 c unix shell signals

我如何在 C 中实现 Ctrl-C 和 Ctrl-D 的信号处理....所以如果按下 Ctrl-C 那么程序将忽略并再次尝试从用户那里获取输入...如果 Ctrl -D 被按下然后程序将终止...

我的程序如下:

int main(){
 char msg[400];

 while(1){
   printf("Enter: ");
   fgets(msg,400,stdin);
   printf("%s\n",msg); 
 }
}

谢谢,

戴夫

最佳答案

在处理 POSIX 信号时,您可以使用两种方法。首先,简单(但不鼓励)的方式,signal() .第二,更优雅,当前但复杂的方式,sigaction() .请使用 sigaction(),除非您发现它在您需要工作的某些平台上不可用。

This chapter glibc 手册的一部分解释了两者之间的差异,并提供了有关如何使用两者的良好示例代码。它还列出了可以处理的信号,建议它们应该如何处理,并更深入地讨论如何判断任何给定信号当前是(或不是) 处理。这比我想在此处粘贴到答案中的代码多得多,因此有链接。

花一两个小时阅读链接和完成示例真的很值得。信号处理(特别是在守护程序中)非常重要。一个好的程序应该处理所有可以处理的致命信号(即 SIGHUP)并明确忽略它可能不使用的信号(即 SIGUSR1/SIGUSR2)。

研究正常信号和实时信号之间的差异也无妨,至少可以了解内核如何合并先验信号而不合并后者。

完成后,您可能会倾向于编写一组易于修改的函数来处理您的信号,并一遍又一遍地重复使用该代码。

很抱歉没有给出一个快速而肮脏的代码片段来向您展示如何解决您的迫切需求,但这不是一个快速而肮脏的话题:)

关于c - C 中的信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2485028/

相关文章:

可以通过系统调用设置局部变量吗?

java - 如果Java进程在Unix(Solaris)/Windows中被杀死,所使用的内存是否会被释放?

linux - 通过算术运算在 hp unix 中循环日期

linux - cut 命令忽略空格

c - 理解 C 中的函数和指针

c - 我需要从驱动器读取原始数据并将数据写入驱动器..help

c - 将矩阵线保存到指针 C 中

unix - 使用 find 删除具有给定名称的所有文件,但具有给定扩展名的文件除外

bash - 如何从 bash 脚本中获取进程 ID 和退出代码?

c - 在 C 中为 shell 脚本使用变量