Потокобезопасное сравнение путей или функция канонизации для Unix? - PullRequest
0 голосов
/ 22 июля 2010

Я видел некоторый древний код, который упрощал пути Unix для сравнения, выполняя что-то вроде следующего псевдокода:

  • убирает последний компонент пути, чтобы получить только часть каталога: / foo / bar-> / foo
  • getcwd и запомните исходный путь
  • chdir / foo
  • getcwd и не забудьте вернуться к вызывающей стороне
  • chdir старый оригинальный путь

Существует ли стандартная системная функция Unix, которая делает все это без текущей небезопасной работы с каталогами?

Мьютекс может сделать эту последовательность кода менее опасной, но на самом деле не идеальна (вынужно знать, что весь другой код, использующий getcwd или другие функции, зависящие от процесса cwd, включая код системы и поставщика, защищает с помощью этого же мьютекса).

Ответы [ 4 ]

2 голосов
/ 22 июля 2010

А как насчет realpath (3) ?

Поскольку он возвращает свой результат в предоставленном вами буфере, безопасность потока не должна быть проблемой.

2 голосов
/ 22 июля 2010

Попробуйте realpath() или canonicalize_file_name()

Если ваша система поддерживает это (и, вероятно, поддерживает), я предлагаю позвонить realpath(pathname, NULL); это malloc буфер для канонизированного имени файла и передача его обратно в качестве возвращаемого значения. Вы должны быть уверены, что free() указатель. Альтернатива, передавая выходной буфер, рискует переполниться буфером.

canonicalize_file_name() - это расширение Gnu, эквивалентное realpath(pathname, NULL).

0 голосов
/ 22 июля 2010

В каталоге Unix нет «канонического» пути.Для файла / каталога может быть несколько жестких ссылок / точек монтирования.

Наиболее близким к идентификатору файла / каталога является его индекс.

0 голосов
/ 22 июля 2010

О, дорогой, выполнение упомянутого вами действия не может быть потокобезопасным, потому что на самом деле это chdir, что может запутать любые другие потоки. Мне нужно будет найти часть, которая вам нужна, для манипуляции со строками, но она также не может удалять софт-ссылки или делать что-либо еще, что требует от операционной системы запрашивать информацию о файлах, не будучи немного небезопасным.

Похожие сообщения:

Попробуйте преобразовать относительные пути к файлам, а затем сравните их как строки:

#include<stdio.h>
#include<dirent.h>
#include<fcntl.h>
#include<sys/param.h>
int main( int argc, char **argv )
{
  char buffer[MAXPATHLEN+1];
  if( argc <= 1 ) return 0;
  DIR*d = opendir( argv[1] );
  if( !d ) return 0;
  int dfd = dirfd(d);
  if( !dfd ) return 0;
  int result = fcntl( dfd, F_GETPATH, buffer );
  if( result == -1 ) return 0;
  fprintf( stdout, "path='%s'\n", buffer );
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...