При написании одной программы мне потребовалась функция, выводящая список директорий в заданной дире. И вот обнаружилась прикольная фича - прога нормально обрабатывает данные только если в качестве директории ей передаётся текущая.
Программа, выводящая список директорий в заданной:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
main(int argc, char *argv[])
{
struct dirent *fd;
DIR *dfd;
struct stat bfstat;
dfd=opendir(argv[1]);
while((fd=readdir(dfd))!=NULL)
{
stat(fd->d_name,&bfstat);
if((bfstat.st_mode & S_IFMT)==S_IFDIR)
printf("%s is a directory\n",fd->d_name);
}
closedir(dfd);
}
пример её запуска:
laz@darkstar:~/devel/tmpdir$ ls -la
итого 20
drwxr-xr-x 4 laz coolusers 4096 2005-09-27 23:15 ./
drwx------ 10 laz coolusers 4096 2005-09-27 23:14 ../
-rw-r--r-- 1 laz coolusers 0 2005-09-27 23:12 file1
-rw-r--r-- 1 laz coolusers 0 2005-09-27 23:13 file2
-rw-r--r-- 1 laz coolusers 401 2005-09-27 23:14 temp.c
drwxr-xr-x 2 laz coolusers 4096 2005-09-27 23:12 test1/
drwxr-xr-x 2 laz coolusers 4096 2005-09-27 23:12 test2/
laz@darkstar:~/devel/tmpdir$ gcc temp.c -o temp
laz@darkstar:~/devel/tmpdir$ ./temp .
. is a directory
.. is a directory
test1 is a directory
test2 is a directory
laz@darkstar:~/devel/tmpdir$ cd ..
laz@darkstar:~/devel$ tmpdir/temp tmpdir/
. is a directory
.. is a directory
test1 is a directory
test2 is a directory
file1 is a directory
file2 is a directory
laz@darkstar:~/devel$ cd tmpdir/test
test1/ test2/
laz@darkstar:~/devel$ cd tmpdir/test1/
/home/laz/devel/tmpdir/test1
laz@darkstar:~/devel/tmpdir/test1$ ../temp ..
. is a directory
.. is a directory
test1 is a directory
test2 is a directory
file1 is a directory
file2 is a directory
temp.c is a directory
temp is a directory
Как видите, в зависимости от диры, из которой она запущена, по разному определяются директории.
В чём прикол понять не могу, друзья программеры с Линуксом не знакомы, а в гугле даже запрос составить толком не могу. Объясните, плз, в чём тут загвоздка.