![]() |
![]() |
![]() |
|
Как в си определить тип открытого файла, регулярный или пайпа ? | ☑ | ||
---|---|---|---|---|
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; } |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |