Kernel dtrace:don';无法捕获任何写系统调用

Kernel dtrace:don';无法捕获任何写系统调用,kernel,system-calls,dtrace,Kernel,System Calls,Dtrace,我是dtrace新手,正在尝试编写一些基本的dtrace脚本。我找到了一个在单独的终端上捕获读(2)和写(2)系统调用的示例,如下所示 syscall::read:entry, syscall::write:entry /pid==4217/ { } 指定的pid编号来自另一个终端的pid id。当我看到这个示例时,如果我使用dtrace运行这个脚本,它应该显示一些读写系统调用。但我只观察到读系统调用,而没有观察到写系统调用 所以,如果我理解正确,在我观察到的终端(pid 4217

我是dtrace新手,正在尝试编写一些基本的dtrace脚本。我找到了一个在单独的终端上捕获读(2)和写(2)系统调用的示例,如下所示

 syscall::read:entry,
 syscall::write:entry
 /pid==4217/
 {

 }
指定的pid编号来自另一个终端的pid id。当我看到这个示例时,如果我使用dtrace运行这个脚本,它应该显示一些读写系统调用。但我只观察到读系统调用,而没有观察到写系统调用


所以,如果我理解正确,在我观察到的终端(pid 4217)上,如果我在该终端上键入某个内容,内核将读取它的字符,所以假设发生了read syscall。如果我键入类似“ls”的内容并按enter键,内核将读取并执行它,并将一些输出写入终端,从而编写假定要调用的syscall。但是我没有看到任何写系统调用。为什么会这样?

我首先要验证write()是否适用于任何其他进程,例如,一个简单的测试用例。在您的示例中,可能(a)是错误的pid,或者是执行写入操作的子项,或者(b)未使用写入调用,但可能是,例如writev()或其他调用(可能尝试使用strace验证)。

我同意@PaulFox,这可能是错误的
pid
值。当终端在按下Enter之前暂停时,终端位于<代码> Read < /Cord> SysCar。但是,当它打印终端提示时(在您按enter键并运行
ls
之后),它会通过执行
write
syscall来执行此操作。请注意,
ls
的输出不是
write
syscall的来源!该
pid
将是正在运行的
ls
命令的进程id

要测试
write
syscall是否实际工作,请运行以下命令:

# dtrace -n 'syscall::write:entry {printf("hello")}'
然后以您的终端(用您正在使用的任何东西替换“bash”)为目标进行尝试:

# dtrace -n 'syscall::write:entry /pid==$target/ {printf("hello")}' -c 'bash'
如果其中一个在您将内容键入终端时无法显示任何写入内容,请发回

还请注意,shell可能正在使用几种版本的write系统调用(尽管如果它使用的不是普通的
write
,我会感到惊讶):

# dtrace -ln 'syscall::*write*:entry'
   ID   PROVIDER            MODULE                          FUNCTION NAME
  147    syscall                                               write entry
  381    syscall                                              writev entry
  447    syscall                                              pwrite entry
  777    syscall                                           aio_write entry
  933    syscall                                      write_nocancel entry
  963    syscall                                     writev_nocancel entry
  969    syscall                                     pwrite_nocancel entry