Имя: Пароль:
IT
 
Как в си определить тип открытого файла, регулярный или пайпа ?
0 Ковычки
 
20.04.13
19:35
Как определить, что открыт file = popen, а не file = fopen ?
1 DimVad
 
20.04.13
20:35
Не могу гарантировать, но вроде - никак. Это же "плоский си". Может, чуть изменить задачу ? Возможно, Вы передаете в функцию дескриптор, и там возможны обе ситуации. Что если передавать не дескриптор, а структуру, в которой первое поле - дескриптор, а во втором - флаг ?
2 Ковычки
 
20.04.13
20:42
(1) с флагом то и дурак могет )
3 Ковычки
 
20.04.13
20:44
вторая загвоздка - как по дескриптору получить имя файла, если то файл ?
(дописка - файловой системы proc может и не быть)
4 DimVad
 
20.04.13
21:05
(2) "с флагом то и дурак могет )" - часто такой подход - самый правильный ;-)

(3) "вторая загвоздка - как по дескриптору получить имя файла, если то файл ? " - очень просто. Имя файла нужно поместить в третье поле структуры ?

Ну, разве не очевидно, что Вам надо тащить набор параметров, связанных с дескриптором ? В С++ это был бы класс, в С - структура ;-)
5 mistеr
 
20.04.13
21:14
Если в функции нужно знать, что за файл, а открываю его где-то еще, значит в дизайне косяк.

Дырявая абстракция.
6 mistеr
 
20.04.13
21:15
* открывают
7 HeroShima
 
20.04.13
21:24
(5) Ещё вопрос, кто открывает, или где.
8 Ковычки
 
20.04.13
21:35
(5) у Вас в голове косяк
файл может быть разным и открытым не единожды

с прос все тривиально

       sprintf(path, "/proc/self/fd/%d", fileno(file));
       readlink(path, filename, 255);

а вот без прос не знаю как
9 Ковычки
 
20.04.13
21:39
можно конечно фстат структуру и найти иноды, но уж больно муторно
10 mistеr
 
20.04.13
21:40
А вообще fstat() и смотреть поле st_mode.
11 Ковычки
 
20.04.13
21:53
(10) да, тут Вы правы
12 Ковычки
 
20.04.13
21:54
остается узнать имя/имена
13 Ковычки
 
20.04.13
22:05
первая часть решена, спасибо mistеr

if ( file != NULL )
{
   struct stat statbuf;
   fstat ( fileno ( file ), &statbuf );
   if ( S_ISREG(statbuf.st_mode) )
       fclose ( file );
   else
       pclose ( file );
   file = NULL;
}
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший