在应用程序被终止之前,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
调用
我想了解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
调用