| 
							psl
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 «  : 09-12-2005 07:33 »   | 
								
								 | 
							  
							 
							Как узнать, сколько дескрипторов ссылается на файл (без привелегий root). 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 09-12-2005 16:58 »   | 
								
								 | 
							  
							 
							[rxl@mail temp]$ touch a [rxl@mail temp]$ ls -l итого 0 -rw-rw-r--  1 rxl rxl 0 Дек  9 19:56 a [rxl@mail temp]$ ln a b [rxl@mail temp]$ ls -l итого 0 -rw-rw-r--  2 rxl rxl 0 Дек  9 19:56 a -rw-rw-r--  2 rxl rxl 0 Дек  9 19:56 b [rxl@mail temp]$
  Правильнее будет сказать, не сколько "дескрипторов у файла", а сколько ссылок на inode есть. Пока число ссылок не дойдет до нуля файл существует.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 09-12-2005 17:00 от RXL »
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							npak
							
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 09-12-2005 17:44 »   | 
								
								 | 
							  
							 
							RXL,
  мне кажется, что psl интересует именно количество открытий заданного файла, а не число жёстких ссылок на файл.
  Не знаю, как это сделать без рутовых прав, но знаю, как сделать с рутовыми: Если имя файла находится в переменной окружения FNAME, то в командной строке ls -l /proc/*/fd | grep --fixed-string "$FNAME" | wc -l 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 09-12-2005 17:59 »   | 
								
								 | 
							  
							 
							Вот такие вот вопросы, что приходится гадать... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							psl
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 13-12-2005 06:44 »   | 
								
								 | 
							  
							 
							Уфф... Я открываю файл fd = open(...); Могу ли я при повторном fd = open(...); как-нибудь узнать, что файл мною уже открыт. Такая информация в файловой системе есть - вопрос как ее получить без привелегий рута. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 13-12-2005 09:33 »   | 
								
								 | 
							  
							 
							Если это твоя программа, то ты и должен знать, открыт ли файл. Я, обычно, для этого делаю переменную, в которую помещая номер открытого файла, и, если надо роверить, есть ли файл, делаю простое if(fd > 0). Переменную надо первоначально проинициализировать, установив в  -1. Так же при закрытии файла надо делать fd=-1. Стоит так же помнить, что дескриптор открытого файла хранит в себе текущую позицию чтения-записи. Если ты будешь работать с файлом в нескольких местах программы, то помни о возможности такого конфликта. Если пользоваться потоковыми ф-иями libc, то можно переоткрывать файл по имени: freopen().
  Этого тебе достаточно? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							npak
							
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 13-12-2005 09:34 »   | 
								
								 | 
							  
							 
							В файловой системе такой информации нет, эта информация хранится в ядре, в структуре данных "процесс".
  Для своего процесса храни список открытых файлов, пользуйся своими средствами. Или посмотри среди ссылок в файловой системе /proc/<id_твоего_процесса>/fd/* 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 13-12-2005 09:53 »   | 
								
								 | 
							  
							 
							Коль, таким же макаром можно еще перебрать все дескрипторы и протестить их на достоверность через fstat(), но имя файла там нет. Как финт ушами: сделать stat() и сравнивать inode с открытыми файлами. Не проверял. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 13-12-2005 10:11 »   | 
								
								 | 
							  
							 
							#include <sys/stat.h> #include <errno.h>
  int get_opened_file(char * filename) {     int i;     struct stat  st_fn, st_fd;
      if (stat(filename, &st_fn))         return -1;     for (i = 0; i < FD_SETSIZE; i++)     {         if (fstat(i, &st_fd))             continue;         if (st_fn.st_dev == st_fd.st_dev && st_fn.st_ino == st_fd.st_ino)             return i;     }     errno = ENOENT;     return -1; }
  Тут доки на ф-ии:  http://docs.netive.ru/susv3/functions/contents.html 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							psl
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 13-12-2005 12:08 »   | 
								
								 | 
							  
							 
							А можно как-нибудь сделать так, чтобы ядро не позволяло открыть больше одного дескриптора для одного файла, не блокируя при этом другой/текущий процесс?
  Т.е. ... fd = open(.."my.file"...);   ... и чтобы при последующем fd = open(.."my.file"...); возвращался fd = -1; пока я не закрою дескриптор close(fd)? 
  Поиск в любом виде я реализовать могу, но мне интересно сделать так, чтобы использовались механизмы ядра/фс. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 13-12-2005 12:49 »   | 
								
								 | 
							  
							 
							Никак. Не придумывай себе проблем. Программа пишется под ОС, а не наоборот.
  Хотя, почитай про блокировку файла. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							npak
							
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 13-12-2005 13:10 »   | 
								
								 | 
							  
							 
							Блокировки файла защищают только от доступа из разных процессов.  Сам процесс может открывать файл со своими блокировками сколько угодно.  По крайней мере это так для flock 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							psl
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									«  Ответ #12 : 13-12-2005 13:46 »    | 
								
								 | 
							  
							 
							>Никак. Не придумывай себе проблем. Программа пишется под ОС, а не наоборот. Вот именно. Поэтому хочется использовать механизмы ОС по максимуму. Какие могут быть в этом случае проблемы?
  Я прочитал всю доступную мне документацию, ответа не нашел - поэтому и задал вопрос, 
  > Хотя, почитай про блокировку файла. а про блокировки в данном случае хорошо сказал npak.
  В любом случае всем большое спасибо за ответы.
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #13 : 13-12-2005 13:48 »   | 
								
								 | 
							  
							 
							Логично - я что-то не подумал.
  Если нужно что-то нестандартное, то надо писать свою оболочку для работы с файлами - там любой контроль можно организовать. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							RXL
							
						 | 
						
							
								  | 
								
									
									 « Ответ #14 : 13-12-2005 13:49 »   | 
								
								 | 
							  
							 
							Какие проблемы? - Так ты же сам их себе создаешь. А зачем тебе такие сложности с файлами? Я думаю, с этого надо начинать. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							psl
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #15 : 14-12-2005 06:25 »   | 
								
								 | 
							  
							 
							>Какие проблемы? - Так ты же сам их себе создаешь. >А зачем тебе такие сложности с файлами? Я думаю, с этого надо начинать.
  Я _не изобретаю_ велосипед - я ездить на нем учусь!:))) 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	 |