"stat"시스템 호출은 파일을 가리키는 여러 개의 하드 링크 나 "inode"번호와 같이 파일에 대한 다른 정보를 수집합니다. "mode"에서 "F_OK"플래그를 지정함으로써 존재 체크를 수행하는 데 사용할 수있는 "액세스"시스템 호출을 볼 수 있습니다.
그러나 코드에 약간의 문제가 있습니다. 그것은 아직 존재하지 않는 파일을 검사 할 때마다 잠깐 프로세스를 잠자기 상태로 만듭니다. 이를 피하기 위해 Jerry Coffin에서 제안한대로 inotify API를 사용해야 만합니다. 대기중인 파일이있을 때 커널이이를 알리기 위해서입니다. inotify는 파일이 이미 있으면 알려주지 않으므로 파일을 만든 직후에 파일을 시청할 때 경쟁 상태가되지 않도록 "액세스"와 "inotify"를 모두 사용해야합니다.
파일이 있는지 확인하는 더 좋고 빠른 방법은 없습니다. 파일 브라우저가이 프로그램이 감지하는 것보다 약간 더 빨리 파일을 표시하면 Greg Hewgill의 이름 바꾸기 아이디어가 실제로 발생합니다.
#include <cstdio>
#include <cstring>
#include <string>
#include <unistd.h>
#include <sys/inotify.h>
int
main()
{
const std::string directory = "/tmp";
const std::string filename = "test.txt";
const std::string fullpath = directory + "/" + filename;
int fd = inotify_init();
int watch = inotify_add_watch (fd, directory.c_str(),
IN_MODIFY | IN_CREATE | IN_MOVED_TO);
if (access (fullpath.c_str(), F_OK) == 0)
{
printf ("File %s exists.\n", fullpath.c_str());
return 0;
}
char buf [1024 * (sizeof (inotify_event) + 16)];
ssize_t length;
bool isCreated = false;
while (!isCreated)
{
length = read (fd, buf, sizeof (buf));
if (length < 0)
break;
inotify_event *event;
for (size_t i = 0; i < static_cast<size_t> (length);
i += sizeof (inotify_event) + event->len)
{
event = reinterpret_cast<inotify_event *> (&buf[i]);
if (event->len > 0 && filename == event->name)
{
printf ("The file %s was created.\n", event->name);
isCreated = true;
break;
}
}
}
inotify_rm_watch (fd, watch);
close (fd);
}
어떤 파일 브라우저를 : 여기에
은 검사 파일이 이미 존재하는 경우를 inotify를 시계를 설정하고, 그렇지 않으면 그것을 위해 기다리는 C++ 코드 예제입니다? 파일을 쓰고있는 것은 무엇입니까? 파일이 약간 다른 이름으로 쓰여지지 않고 마지막 순간에 이름이 변경되지 않았습니까? –
나는 konqueror를 사용하고 있지만, 돌고래는 stat보다 이전에 알려줍니다. 파일은 내가 작성한 응용 프로그램에 의해 쓰여지고 있으므로, 무엇을 어디에 써야하는지 알고 있습니다. 또한 파일은 프로세스가 완료되었음을 알리기 위해 쓰는 빈 파일입니다. –
이 지연 시간은 얼마나 걸립니까? 마이크로 초 또는 분 단위입니까? 'stat()'가 실제로 존재할 때 파일이 존재 함을 나타내지 못하는 이유가 없어야합니다. 당신이 아직 알아 내지 못했던 다른 것이 여기에 있다고 생각합니다. –