小编kli*_*eyn的帖子

用户级程序应该捕获哪些"致命"信号?

首先,我知道过去有类似的问题.

但这个问题没有得到妥善回答.相反,它转而建议如何捕捉信号.

所以只是为了澄清:我已经完成了处理信号所需要做的一切.我有一个应用程序,它通过管道分配监视主进程的守护进程.如果主进程崩溃(例如分段错误),它有一个信号处理程序,它将所有必需的信息写入管道并中止.

目标是在应用程序发生不良事件时尽可能多地获取信息,而不用处理"正常"操作,例如SIGHUP,SIGUSR1等.

所以我的问题是:我应该抓住哪些信号? 我的意思是说,如果没有我捕获它们的信号会导致应用程序中止.

到目前为止,我已经提出以下列表:

  • SIGINT(^ C,用户启动,但仍然很好知道)
  • SIGTERM(kill <pid>来自shell或AFAIK,可以是OutOfMemory的结果)
  • SIGSEGV
  • SIGILL
  • SIGFPE
  • SIGBUS
  • SIGQUIT

有人知道我是否错过了什么?kill -l有很多...... :)

c linux posix signals

7
推荐指数
2
解决办法
1234
查看次数

如何排除"git diff-index"中的文件

我正在使用git pre-commit钩子来检查提交.预提交脚本基本上做了一件事:

exec git diff-index --check --cached HEAD --
Run Code Online (Sandbox Code Playgroud)

它也做了一些其他的事情,但它们与这个讨论无关.

问题是,我在存储库中有各种各样的文件,并不是所有文件都必须遵守" git diff-index --check" 强制执行的检查.

所以我的问题是:如何排除/忽略这些文件?也就是说,我确实在git中跟踪它们,但我想在预提交检查中忽略它们.

例如,某个补丁包含*.c,*.h,*ini和*.xyz文件.我希望" git diff-index --check"仅适用于.c和.h文件.

git

4
推荐指数
1
解决办法
931
查看次数

C/C++中的编译时按位运算

我试图理解C/C++编译器如何处理按位操作.具体来说,我说的是用gcc编译的C语言,但我相信这个问题比这更为笼统.

无论如何,假设我有一个定义如下的宏:

  #define SOME_CONSTANT 0x111UL
  #define SOME_OFFSET   2
  #define SOME_MASK     7
  #define SOME_VALUE    ((SOME_CONSTANT) << (SOME_OFFSET)) & (SOME_MASK)

  static inline void foo() { printf("Value: %lu#n", SOME_VALUE); }
Run Code Online (Sandbox Code Playgroud)

SOME_VALUE的所有成分都是常量,它们在编译时都是已知的.

所以我的问题是:gcc会在编译时评估SOME_VALUE,还是仅在运行时完成? 如何检查gcc是否支持此类优化?

c gcc bit-manipulation bit

3
推荐指数
2
解决办法
1250
查看次数

如何计算非线性 skb/payload 的 TCP/UDP 校验和?

我正在尝试在发送的 skb 上计算 TCP/UDP 标头校验和。

基本上,有两个函数可以完成所有工作(在这个 stackoverflow 问题中也提到这个也是):

  • csum_tcpudp_magic
  • csum_partial

例如,对于 TCP:

  tcph->check = 0;
  tcph->check = csum_tcpudp_magic(iph->saddr,
                                  iph->daddr,
                                  tcp_packet_len,
                                  IPPROTO_TCP,
                                  csum_partial((unsigned char *)tcph,
                                               tcp_packet_len,
                                               0));
Run Code Online (Sandbox Code Playgroud)

这工作正常 - 我能够传输 TCP/UDP 数据包并在接收端使用 wireshark 验证校验和。但是,我找不到有关碎片化 SKB 的任何信息。

当 TCP/UDP 负载碎片化时,这两个“魔法”函数会处理这种情况吗?

此外,TCP/UDP 标头可能位于 SKB 的非线性部分(也可能是分段的)。

这些功能也会处理这种情况吗?

我确实明白我可以尝试使用更大的数据包,这会导致它们碎片化,但是现在错误处理的代价将是内核 oops,而且我无法关闭系统。

networking udp tcp linux-device-driver linux-kernel

2
推荐指数
1
解决办法
2952
查看次数