在应用程序被终止之前,iosnoop (dtrace) 没有输出

No output from iosnoop (dtrace) until application is killed

我想了解iosnoop。为此,我写了一个小程序来跟踪。如果我刷新缓存,我希望在 iosnoop 中看到一些东西。在我终止应用程序之前,我什么都看不到。我做错了什么。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/types.h>

int main(){
    pid_t pid = getpid();
    printf("pid: %lun", pid);

    FILE *file = fopen("hanswurst.txt", "a");

    while(1){
        fputs("Hello\n", file);
        fflush(file);
        sleep(1);
    }


    fclose(file);
    return 0;
}

看来,至少在 macOS 上,iosnoop 只监视 OS I/O 硬件事件。 fflush() 调用仅将 C API 文件 I/O 缓冲区刷新到 OS 缓冲区,但在您的文件关闭之前,不会将任何内容写入磁盘。

您可以在 fflush() 之后添加一个 fsync(fileno(file)); 来告诉 OS 将其缓冲区写入磁盘。

详情见。

或者,如果您想查看没有 fsync() 的程序会发生什么情况,您可以使用 dtruss 而不是 iosnoop。它将在程序发生时显示系统调用,并将显示对 OS.

write 调用