2012-10-16 9 views
11

Volevo sapere quale chiamata di sistema viene utilizzata in Linux dal comando ls per visualizzare il nome della cartella (o del file)? Soprattutto i file/cartelle che iniziano con "." (punto)Quale chiamata di sistema linux viene utilizzata dal comando ls in linux per visualizzare il nome della cartella/del file?

Ho eseguito il comando strace ls -a per esaminare le chiamate di sistema. Esistono molte chiamate fstat che si verificano per tutti gli altri attributi (inode ai permisison). Quale effettivamente dà il suo nome?

execve("/bin/ls", ["ls", "-a"], [/* 37 vars */]) = 0 
brk(0)         = 0x1762000 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c14025000 
access("/etc/ld.so.preload", R_OK)  = -1 ENOENT (No such file or directory) 
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 
fstat(3, {st_mode=S_IFREG|0644, st_size=109464, ...}) = 0 
mmap(NULL, 109464, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1c1400a000 
close(3)        = 0 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
open("/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20T\0\0\0\0\0\0"..., 832) = 832 
fstat(3, {st_mode=S_IFREG|0644, st_size=121936, ...}) = 0 
mmap(NULL, 2221680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c13be6000 
mprotect(0x7f1c13c03000, 2093056, PROT_NONE) = 0 
mmap(0x7f1c13e02000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c000) = 0x7f1c13e02000 
mmap(0x7f1c13e04000, 1648, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c13e04000 
close(3)        = 0 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340!\0\0\0\0\0\0"..., 832) = 832 
fstat(3, {st_mode=S_IFREG|0644, st_size=31752, ...}) = 0 
mmap(NULL, 2128984, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c139de000 
mprotect(0x7f1c139e5000, 2093056, PROT_NONE) = 0 
mmap(0x7f1c13be4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f1c13be4000 
close(3)        = 0 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
open("/lib/x86_64-linux-gnu/libacl.so.1", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\33\0\0\0\0\0\0"..., 832) = 832 
fstat(3, {st_mode=S_IFREG|0644, st_size=31096, ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c14009000 
mmap(NULL, 2126312, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c137d6000 
mprotect(0x7f1c137dd000, 2093056, PROT_NONE) = 0 
mmap(0x7f1c139dc000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f1c139dc000 
close(3)        = 0 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\30\2\0\0\0\0\0"..., 832) = 832 
fstat(3, {st_mode=S_IFREG|0755, st_size=1811128, ...}) = 0 
mmap(NULL, 3925208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c13417000 
mprotect(0x7f1c135cc000, 2093056, PROT_NONE) = 0 
mmap(0x7f1c137cb000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b4000) = 0x7f1c137cb000 
mmap(0x7f1c137d1000, 17624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c137d1000 
close(3)        = 0 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r\0\0\0\0\0\0"..., 832) = 832 
fstat(3, {st_mode=S_IFREG|0644, st_size=14768, ...}) = 0 
mmap(NULL, 2109704, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c13213000 
mprotect(0x7f1c13215000, 2097152, PROT_NONE) = 0 
mmap(0x7f1c13415000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f1c13415000 
close(3)        = 0 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200l\0\0\0\0\0\0"..., 832) = 832 
fstat(3, {st_mode=S_IFREG|0755, st_size=135366, ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c14008000 
mmap(NULL, 2212904, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c12ff6000 
mprotect(0x7f1c1300e000, 2093056, PROT_NONE) = 0 
mmap(0x7f1c1320d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7f1c1320d000 
mmap(0x7f1c1320f000, 13352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1c1320f000 
close(3)        = 0 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
open("/lib/x86_64-linux-gnu/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\17\0\0\0\0\0\0"..., 832) = 832 
fstat(3, {st_mode=S_IFREG|0644, st_size=18552, ...}) = 0 
mmap(NULL, 2113736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1c12df1000 
mprotect(0x7f1c12df5000, 2093056, PROT_NONE) = 0 
mmap(0x7f1c12ff4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7f1c12ff4000 
close(3)        = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c14007000 
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c14005000 
arch_prctl(ARCH_SET_FS, 0x7f1c140057c0) = 0 
mprotect(0x7f1c137cb000, 16384, PROT_READ) = 0 
mprotect(0x7f1c12ff4000, 4096, PROT_READ) = 0 
mprotect(0x7f1c1320d000, 4096, PROT_READ) = 0 
mprotect(0x7f1c13415000, 4096, PROT_READ) = 0 
mprotect(0x7f1c139dc000, 4096, PROT_READ) = 0 
mprotect(0x7f1c13be4000, 4096, PROT_READ) = 0 
mprotect(0x7f1c13e02000, 4096, PROT_READ) = 0 
mprotect(0x618000, 4096, PROT_READ)  = 0 
mprotect(0x7f1c14027000, 4096, PROT_READ) = 0 
munmap(0x7f1c1400a000, 109464)   = 0 
set_tid_address(0x7f1c14005a90)   = 4490 
set_robust_list(0x7f1c14005aa0, 0x18) = 0 
futex(0x7fff2e09d99c, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, 7f1c140057c0) = -1 EAGAIN (Resource temporarily unavailable) 
rt_sigaction(SIGRTMIN, {0x7f1c12ffc750, [], SA_RESTORER|SA_SIGINFO, 0x7f1c13005cb0}, NULL, 8) = 0 
rt_sigaction(SIGRT_1, {0x7f1c12ffc7e0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7f1c13005cb0}, NULL, 8) = 0 
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0 
statfs("/selinux", {f_type="EXT2_SUPER_MAGIC", f_bsize=4096, f_blocks=238304997, f_bfree=232078639, f_bavail=219973436, f_files=60530688, f_ffree=60120220, f_fsid={-1173666966, -474985328}, f_namelen=255, f_frsize=4096}) = 0 
brk(0)         = 0x1762000 
brk(0x1783000)       = 0x1783000 
open("/proc/filesystems", O_RDONLY)  = 3 
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c14024000 
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 328 
read(3, "", 1024)      = 0 
close(3)        = 0 
munmap(0x7f1c14024000, 4096)   = 0 
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 
fstat(3, {st_mode=S_IFREG|0644, st_size=7220736, ...}) = 0 
mmap(NULL, 7220736, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1c1270e000 
close(3)        = 0 
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 
ioctl(1, TIOCGWINSZ, {ws_row=41, ws_col=144, ws_xpixel=0, ws_ypixel=0}) = 0 
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 
getdents(3, /* 2 entries */, 32768)  = 48 
getdents(3, /* 0 entries */, 32768)  = 0 
close(3)        = 0 
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1c14024000 
write(1, ". ..\n", 6. .. 
)     = 6 
close(1)        = 0 
munmap(0x7f1c14024000, 4096)   = 0 
close(2)        = 0 
exit_group(0)       = ? 

risposta

21

La maggior parte delle chiamate di sistema ci sono disturbi dal caricamento delle librerie condivise all'avvio. Le cose interessanti accadono qui:

openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 
getdents(3, /* 2 entries */, 32768)  = 48 
getdents(3, /* 0 entries */, 32768)  = 0 
close(3) 

La chiamata di sistema openat(2) viene utilizzato per aprire la directory corrente (".") relativo alla directory di lavoro corrente (la bandiera AT_FDCWD). Il flag O_DIRECTORY indica che desidera aprire la directory e leggere il contenuto della directory.

I dati della directory effettiva vengono letti utilizzando la chiamata di sistema getdents(2). In questo caso, lo ha chiamato due volte, poiché fino a quando non restituisce 0, non è sicuro se ci sono più dati o meno. Infine, il descrittore di file viene chiuso dopo averlo terminato.

Se si dovesse scrivere il proprio programma, tuttavia, non si chiamerebbero direttamente - invece si utilizzerà opendir(3), readdir(3) e closedir(3) per leggere una directory. Sono portatili (conformi a POSIX) e ti isolano dai dettagli delle chiamate di sistema sottostanti. Sono anche più facili da usare, IMO.

0

è il stat(2) syscall che interrogare lo stato di alcuni file di (forse una directory); se si dispone di un descrittore di file (dopo un open(2) syscall) è possibile utilizzare fstat(2)

Per leggere un elenco, si utilizzare al meglio la funzione di readdir(3) che chiama la getdents(2) syscall.