我必须捕获从主机 A 发送到主机 B 的任何 UDP 端口的所有 UDP 数据包。以下,如果在主机 B 上运行,则不起作用。
$ sudo tcpdump -i eth0 -SX udp src <hostA>
tcpdump: 'udp' modifier applied to host
Run Code Online (Sandbox Code Playgroud)
实现相同目标的正确命令行是什么?
这是一个 C 代码片段,它将导致segfault:
// segfault.c
#include <string.h>
int main()
{
memset((char *)0x0, 1, 100);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
编译它:
gcc segfault.c -o segfault
Run Code Online (Sandbox Code Playgroud)
如果从 bash 执行:
$ ./segfault
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
现在我将调用封装在 bash 脚本中。连续尝试了3次。我想获取变量内的错误输出ret并显示它。
#!/bin/bash
# segfault.sh
ret=`./segfault 2>&1`
echo "1) " $ret
ret=`eval ./segfault 2>&1`
echo "2) " $ret
ret=`eval ./segfault 2>&1 | cat`
echo "3) " $ret
Run Code Online (Sandbox Code Playgroud)
如果我从 bash 执行脚本:
1)
2)
3) ./segfault.sh: line 7: 28814 Segmentation fault (core dumped) ./segfault
Run Code Online (Sandbox Code Playgroud)
显然,只有第三种形式的调用有效。我的问题是,为什么前两种形式不能捕获错误输出?
一个小时的谷歌搜索表明主流Linux 内核错误被记录在两个不同的系统中:
这是 Linux 内核开发讨论和错误报告邮件列表。
邮件列表由许多服务存档,例如
这是 Kernel Tracker 系统(基于 Bugzilla),用于针对主线 Linux 内核(不是分发内核)发布错误。
发行版,例如Ubuntu 有自己的错误跟踪器,可以设置为跟踪上游错误。
我想知道,
在 上Ubuntu 14.04, 64 bit,我已设置/lib/modules/4.2.0-27-generic/kernel/drivers为我的当前目录。我打算搜索所有net作为子字符串存在的文件。如果我使用 的正则表达式进行搜索,则*net*仅./net返回目录作为搜索结果。但是,如果我指定确切的文件名,那么它只会列出相关的文件(没用,因为我并不总是知道要交叉检查的确切文件名)。
$ find . -name *net*
./net
$ find . -name *usbnet*
./net/usb/usbnet.ko
$ pwd
/lib/modules/4.2.0-27-generic/kernel/drivers
Run Code Online (Sandbox Code Playgroud)
我犯了什么错误?
但请记住,“禁用 irqs” 是一种根本上不安全的禁用抢占的方式 - 任何将抢占计数减少到 0 的 spin_unlock() 都可能会触发重新调度。一个简单的 printk() 可能会触发重新安排。
如果 IRQ 被禁用,那么该 CPU 内核上的定时器中断也应该被禁用。自然,它应该依次禁用调度程序(抢占)。为什么调用 irqsdisabled() 来禁用抢占是不安全的方法?
此外, printk() 如何触发重新安排?
我遇到了 bash/dash 这个奇怪的参数扩展,我没有找到任何参考。这种扩展叫什么?它在哪里记录?
$ /???
bash: /bin: Is a directory
$ /????
bash: /boot: Is a directory
$ /?????
bash: /cdrom: Is a directory
$ /??????
bash: /libx32: Is a directory
Run Code Online (Sandbox Code Playgroud)