|
Как в си определить тип открытого файла, регулярный или пайпа ? |
☑ |
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;
}
|
|
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший