假设您正在使用fprintf()
手册页:
成功时,返回写入的字符总数。
所以:
char
将要写入的数组的大小存储到变量中x
- 如果
fprintf()
小于x
,则写入被中断。
- 优雅地退出
编辑:
我在想两件事:
1:putchar()
失败时,表示写入文件时出错。由于写入一个字节不会花费很长时间,这应该不太可能,因为一旦写入字节(或您假设)它将处于安全状态。
你可以这样做
if(putchar(c) == EOF){
//write error
}
2:如果您在检测到文件删除时被要求退出,那么您需要监视目录。幸运的是,您只查看一个目录。然而,该while
循环阻碍了事情的发展,因为getchar()
它是一个阻塞函数(在发生某些事情之前不能返回)。您应该使用inotify来监视目录,然后可能轮询以轮询inotify()
. 当我这样做时,我使用了选择,因为我们被迫这样做。
某种想法如何监视目录inotify()
int length, i = 0;
char buffer[EVENT_BUF_LEN];
memset(buffer, 0, EVENT_BUF_LEN*sizeof(char));
//init inotify
fd = inotify_init();
if(fd < 0){
perror("inotify init");
}
//add directory to watch list
wd = inotify_add_watch(fd, path , IN_DELETE |
IN_DELETE_SELF | IN_MODIFY | IN_MOVE_SELF | IN_MOVED_FROM | IN_MOVED_TO);
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
//wait for event, since read() blocks
length = read( fd, buffer, EVENT_BUF_LEN );
if ( length < 0 ) {
perror("zero event length");
}
struct inotify_event *event;
while (i < length){
//cast the event to a char buffer
event = (struct inotify_event*) &buffer[i];
if (event->len){
//this was a custom function of mine
storeEvent(event);
}
i += EVENT_SIZE + event->len;
}
您必须检查添加目录时要使用的属性(如IN_DELETE
或IN_MODIFY
),因为它们将确定触发inotify()
事件的内容。read()
请注意,此代码将仅检测一个事件,并在语句处阻塞。