Уважаемые, обращаюсь к Вам за советом.
1) select/poll
Есть директория (к примеру dir), в которую асинхронно пользователем
сваливаются файлы, а программа должна отслеживать изменения в
структуре каталога и узнавать имена вновь прибывших файлов.
Естественно, что нам необходим или select или poll. Вопрос в том как
правильно написать этот код.
Моя попытка:
int d, fd;
struct pollfd cdp[1];
d = open(dir, O_RDONLY, S_IRUSR);
cdp[0].fd = d;
cdp[0].events = POLLRDNORM;
while(1) {
fd = poll(cdp, 1, -1);
if (fd == -1 || (cdp[0].revents & (POLLERR|POLLHUP|POLLNVAL))) {
/* ERROR */
}
else if (fd == 0) {
/* ERROR */
}
else {
if (read(d, buf, sizeof(buf)) == -1) {
/* ERROR */
}
else {
/* в buf хочу получить имя файла (ну или структурку какую) */
}
}
Дык вот этот код как умолишенный начинает работать. В buf пишется
один символ (^F). Это вероятно ошибка. Как нужно переделать?
2) fdopen и open
Вопрос второй. open умеет разделять права доступа к файлу на owner,
owner group и other. fdopen не умеет. Как с помощь fdopen получить
FILE* на открытый дескриптор:
fd = open(file, O_CREAT | O_EXCL, S_IRWXU);
?
fdopen(fd, "w") не работает (возвращает 0x0 (NULL)).
Форум —
Development
