を使用していると仮定するとfprintf()
、マニュアルページから:
成功すると、書き込まれた文字の総数が返されます。
それで:
char
変数に書き込む配列のサイズを格納しますx
fprintf()
未満の場合、x
書き込みは中断されました。
- 優雅に終了します
編集:
私が考えていることは2つあります。
1:putchar()
失敗した場合は、ファイルへの書き込み時にエラーを示します。1バイトの書き込みはそれほど長くはかからないため、バイトが書き込まれると(または想定して)安全な状態になるため、これは起こりそうにありません。
あなたはそうすることができます
if(putchar(c) == EOF){
//write error
}
2:ファイルの削除を検出した瞬間に終了するように求められた場合は、ディレクトリを監視する必要があります。幸いなことに、あなたは1つのディレクトリしか見ていません。ただし、これはブロッキング関数while
であるため、そのループは物事の邪魔になりgetchar()
ます(何かが発生するまで戻ることはできません)。inotifyを使用してディレクトリを監視してから、おそらくポーリングしてのファイル記述子をポーリングする必要がありますinotify()
。私がこれをしたとき、私たちは強制されたのでselectを使用しました。
ディレクトリを監視する方法についてのある種のアイデア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()
このコードは1つのイベントのみを検出し、read()
ステートメントでブロックすることに注意してください。