gpt4 book ai didi

c - 文件指针似乎停止前进

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:41 26 4
gpt4 key购买 nike

我正在将一个使用 sys/inotify.h 的 Linux 日志监视程序移植到将使用 kqueues 的 OS X。这个想法是 kqueue 将使用文件描述符来监视文件的更改。一旦文件发生变化,一个不同的函数将被传递一个文件指针并扫描文件的变化,寻找特定的数据。原始文件数据将被打印到 stdout,被扫描的数据将被打印到 stderr。 kqueues 似乎正在很好地监视日志,每次更改返回正确的字节数。是扫描功能似乎无法正常工作。

kqueue 循环:

#define BUFLEN 2048

int i, kq, off, rval, fplen;
char *path = "file_to_watch";
FILE *fp;
struct kevent ke_mon, ke_data;
struct stat stats;

fp = fopen(path, "r");

fstat(fileno(fp), &stats);
fplen = stats.st_size;

kq = open(path, O_RDONLY);

EV_SET(&ke_mon, kq, EVFILT_VNODE, EV_ADD, NOTE_DELETE|NOTE_RENAME, 0, path);
EV_SET(&ke_mon, kq, EVFILT_READ, EV_ADD, 0, 0, path);

off = 0;
rval = 0;
while(off < BUFLEN) {
memset(&ke, 0x00, sizeof(ke));

i = kevent(kq, NULL, 0, &ke_data, 1, NULL); // wait indefinitely for log to update

if (i < 0 || ke_data.flags & EV_ERROR)
continue;
if (ke_data.flags & EVFILT_READ)
rval |= LOG_MODIFIED;
if (ke_data.flags & EVFILT_VNODE)
// rval |= LOG_DELETED or LOG_RENAMED, depending on ke_data.fflags

off += ke_data.data;
lseek(kq, ke_data.data, SEEK_CUR); // Update the descriptor's location
}

if (rval & LOG_MODIFIED) {
// check for truncation.
if (truncated) {
// do some stuff
} else {
fplen = scan_log(fp);
}
}

if (rval & (LOG_DELETED|LOG_RENAMED)
// log was moved or renamed (rotation) so we would start over with new log

扫描日志功能:

int scan_log(FILE *fp)
{
char buf[1024];
int ct = 0;

while (fgets(buf, 1024, fp) != NULL {
ct += strlen(buf);
fprintf(stdout, "%s", buf);

for ( some looping construct) {
// Sometimes we don't ever enter this loop. It all depends on if there
// is data we are expecting to see.
// If we are in this loop however, do the following...
// Match data that I'm looking for and print to stderr.
// Print all log data to stdout
}
}

fflush(stdout);
fflush(stderr);
return ct;
}

scan_log 函数未从该程序的 Linux 版本中更改,经验证可以正常工作,即使从未进入 scan_log 中的 for 循环。有时没有必要。

发生的事情是日志中的没有被打印到 stderr 或 stdout。我在 scan_log 之前和之后调用 ftell 来观察 fp 的位置。它在第一次通过时继续移动,但之后就再也没有移动过。在任何一种情况下,都不会将数据打印到标准输出/标准错误。

编辑:更新了 scan_log() 代码以包含缺少的 fprintf 调用。

最佳答案

我遇到的问题与 Linux 和 Unix 的细微差别有关。 Unix 中的文件指针设置一个 EOF 标志,必须通过调用 clearerr(FILE *) 手动清除该标志,以便文件指针在文件超出其旧 EOF 时前进。

关于c - 文件指针似乎停止前进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23817395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com