|
|
|
![]() |
|
Strumenti |
![]() |
#1 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
[Posix] Semafori
Qualcuno mi spiega perche per creare un semaforo utilizzando sem_open devo avere montato tmpfs su /dev/shm?
Eppure da ciò che leggo quà la cosa dovrebbe funzionare ugualmente senza, invece ottengo un "Function not defined" Quote:
__________________
Ciao ~ZeRO sTrEsS~ |
|
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
l'errore quando te lo da ? |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
Se ho montato /dev/shm nessun problema, se invece non lo ho ottengo un "Function not defined"
__________________
Ciao ~ZeRO sTrEsS~ |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Io lavoro su Sun Solaris e col codice seguente : Codice:
#include <stdio.h> #include <semaphore.h> void main( int argc, char **argv ) { sem_t *s = sem_open( "semaf", O_CREAT ); printf( "s %p: <%p>\n", s ); sem_close(s); } Ho un client linux ma la sem_open neanche c'e' ![]() ma e' un linux versione Flingstones ![]() mi spiace... |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Grazie del tantatvo, stasera cerco di fare una prova su una knoppix e vediamo che dice.
![]()
__________________
Ciao ~ZeRO sTrEsS~ |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Puoi catturare la strace del programma eseguito con e senza la shm?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Certo, questo è il codice
Codice:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <errno.h> #include <semaphore.h> #include <fcntl.h> #include <sys/stat.h> #define _POSIX_SOURCE 1 char *name = "ciao"; int value; int main (int argc, char *argv[]) { sem_t *semaforo; if ((semaforo = sem_open(name,O_CREAT,S_IROTH,4)) == SEM_FAILED) perror("semaforo"), exit(-1); printf("valore %d",value); return EXIT_SUCCESS; } Codice:
execve("./semaforo", ["./semaforo"], [/* 45 vars */]) = 0 uname({sys="Linux", node="WhiteStar", ...}) = 0 brk(0) = 0x804a000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=89992, ...}) = 0 mmap2(NULL, 89992, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f44000 close(3) = 0 open("/lib/tls/librt.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\35\0\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=34763, ...}) = 0 mmap2(NULL, 29260, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7f3c000 mmap2(0xb7f42000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5) = 0xb7f42000 close(3) = 0 open("/lib/tls/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20O\1\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1441281, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f3b000 mmap2(NULL, 1240284, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e0c000 mmap2(0xb7f35000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x128) = 0xb7f35000 mmap2(0xb7f39000, 7388, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f39000 close(3) = 0 open("/lib/tls/libpthread.so.0", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20H\0\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=88005, ...}) = 0 mmap2(NULL, 70104, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7dfa000 mmap2(0xb7e08000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xd) = 0xb7e08000 mmap2(0xb7e0a000, 4568, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7e0a000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7df9000 mprotect(0xb7f35000, 4096, PROT_READ) = 0 set_thread_area({entry_number:-1 -> 6, base_addr:0xb7df96c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 munmap(0xb7f44000, 89992) = 0 set_tid_address(0xb7df9708) = 4293 rt_sigaction(SIGRTMIN, {0xb7dfe3a0, [], SA_SIGINFO}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {0xb7dfe420, [], SA_RESTART|SA_SIGINFO}, 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 _sysctl({{CTL_KERN, KERN_VERSION}, 2, 0xbfa6f11c, 44, (nil), 0}) = 0 statfs("/dev/shm", {f_type=0x1021994, f_bsize=4096, f_blocks=48014, f_bfree=48013, f_bavail=48013, f_files=48014, f_ffree=48012, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0 futex(0xb7e0b188, FUTEX_WAKE, 2147483647) = 0 open("/dev/shm/sem.ciao", O_RDWR|O_NOFOLLOW) = 3 fstat64(3, {st_mode=S_IFREG|04, st_size=16, ...}) = 0 brk(0) = 0x804a000 brk(0x806b000) = 0x806b000 mmap2(NULL, 16, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = 0xb7f59000 close(3) = 0 fstat64(1, {st_mode=S_IFCHR|0700, st_rdev=makedev(136, 4), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f58000 write(1, "valore 0", 8valore 0) = 8 munmap(0xb7f58000, 4096) = 0 exit_group(0) = ? Process 4293 detached
__________________
Ciao ~ZeRO sTrEsS~ |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Questo è quello che accade senza shm.
Da notare che ora mi è successa una cosa strana, ovvero avevo shm montato, do un umount /dev/shm lancio il programma e sembra andare, poi ho tolto la rispettiva riga da /etc/fstab e mi dice semaforo: Function not implemented Codice:
execve("./semaforo", ["./semaforo"], [/* 45 vars */]) = 0 uname({sys="Linux", node="WhiteStar", ...}) = 0 brk(0) = 0x804a000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=89992, ...}) = 0 mmap2(NULL, 89992, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fc1000 close(3) = 0 open("/lib/tls/librt.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\35\0\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=34763, ...}) = 0 mmap2(NULL, 29260, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7fb9000 mmap2(0xb7fbf000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5) = 0xb7fbf000 close(3) = 0 open("/lib/tls/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20O\1\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1441281, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fb8000 mmap2(NULL, 1240284, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e89000 mmap2(0xb7fb2000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x128) = 0xb7fb2000 mmap2(0xb7fb6000, 7388, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fb6000 close(3) = 0 open("/lib/tls/libpthread.so.0", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20H\0\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=88005, ...}) = 0 mmap2(NULL, 70104, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e77000 mmap2(0xb7e85000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xd) = 0xb7e85000 mmap2(0xb7e87000, 4568, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7e87000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e76000 mprotect(0xb7fb2000, 4096, PROT_READ) = 0 set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e766c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 munmap(0xb7fc1000, 89992) = 0 set_tid_address(0xb7e76708) = 4315 rt_sigaction(SIGRTMIN, {0xb7e7b3a0, [], SA_SIGINFO}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {0xb7e7b420, [], SA_RESTART|SA_SIGINFO}, 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 _sysctl({{CTL_KERN, KERN_VERSION}, 2, 0xbfee944c, 44, (nil), 0}) = 0 statfs("/dev/shm", {f_type="EXT2_SUPER_MAGIC", f_bsize=4096, f_blocks=9340888, f_bfree=7893910, f_bavail=7411760, f_files=9647680, f_ffree=9476792, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0 brk(0) = 0x804a000 brk(0x806b000) = 0x806b000 open("/proc/mounts", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fd6000 read(3, "rootfs / rootfs rw 0 0\n/dev/root"..., 1024) = 170 read(3, "", 1024) = 0 close(3) = 0 munmap(0xb7fd6000, 4096) = 0 futex(0xb7e88188, FUTEX_WAKE, 2147483647) = 0 dup(2) = 3 fcntl64(3, F_GETFL) = 0x2 (flags O_RDWR) fstat64(3, {st_mode=S_IFCHR|0700, st_rdev=makedev(136, 4), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fd6000 _llseek(3, 0, 0xbfee9140, SEEK_CUR) = -1 ESPIPE (Illegal seek) write(3, "semaforo: Function not implement"..., 35semaforo: Function not implemented ) = 35 close(3) = 0 munmap(0xb7fd6000, 4096) = 0 exit_group(-1) = ? Process 4315 detached
__________________
Ciao ~ZeRO sTrEsS~ |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Accessing named semaphores via the file system
On Linux, named semaphores are created in a virtual file system, normally mounted under /dev/shm, with names of the form sem.name. Da man sem_overview
__________________
Ciao ~ZeRO sTrEsS~ |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Già, un oggetto "named" corrisponde a qualche oggetto sul file system.
Ho provato il programma e, almeno da me, funziona in maniera identica sia con /dev/shm montata o non. Viene sempre scritto un file in /dev/shm e, a parte il piccolo fastidio di doverlo eseguire con i privilegi di root se /dev/shm non è montato, non ho visto altre differenze. L'errore "Function not implement" che leggo dalla tua strace è fuorviante, in quanto non è l'errore ritornato da una syscall che non esiste, ma un errore inventato di sana pianta dalle tue libc. Non c'è infatti nessuna syscall che ritorna -1 con ENOSYS. Questo è il mio trace con un normale ext2 montato su /dev/shm: Codice:
execve("./sem", ["./sem"], [/* 41 vars */]) = 0 uname({sys="Linux", node="kano.giancarlo.net", ...}) = 0 brk(0) = 0x804a000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fb6000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=89459, ...}) = 0 mmap2(NULL, 89459, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fa0000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/tls/librt.so.1", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\35\0\000"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0644, st_size=30612, ...}) = 0 mmap2(NULL, 29264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7f98000 mmap2(0xb7f9e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6) = 0xb7f9e000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/tls/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260O\1"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1270928, ...}) = 0 mmap2(NULL, 1276892, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e60000 mmap2(0xb7f8e000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12e) = 0xb7f8e000 mmap2(0xb7f96000, 7132, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f96000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/tls/libpthread.so.0", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340G\0"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=85770, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e5f000 mmap2(NULL, 70104, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e4d000 mmap2(0xb7e5b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xd) = 0xb7e5b000 mmap2(0xb7e5d000, 4568, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7e5d000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e4c000 mprotect(0xb7f8e000, 20480, PROT_READ) = 0 set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e4c6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 munmap(0xb7fa0000, 89459) = 0 set_tid_address(0xb7e4c708) = 9857 rt_sigaction(SIGRTMIN, {0xb7e51360, [], SA_SIGINFO}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {0xb7e513e0, [], SA_RESTART|SA_SIGINFO}, 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 _sysctl({{CTL_KERN, KERN_VERSION}, 2, 0xbfb1a920, 43, (nil), 0}) = 0 statfs("/dev/shm", {f_type="EXT2_SUPER_MAGIC", f_bsize=1024, f_blocks=9911, f_bfree=9819, f_bavail=9307, f_files=2560, f_ffree=2549, f_fsid={0, 0}, f_namelen=255, f_frsize=1024}) = 0 brk(0) = 0x804a000 brk(0x806b000) = 0x806b000 open("/proc/mounts", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fb5000 read(3, "rootfs / rootfs rw 0 0\n/dev/root"..., 1024) = 465 statfs("/dev", {f_type=0x1021994, f_bsize=4096, f_blocks=2560, f_bfree=2527, f_bavail=2527, f_files=129516, f_ffree=129262, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0 close(3) = 0 munmap(0xb7fb5000, 4096) = 0 futex(0xb7e5e188, FUTEX_WAKE, 2147483647) = 0 open("/dev/sem.ciao", O_RDWR|O_NOFOLLOW) = -1 ENOENT (No such file or directory) gettimeofday({1149584441, 562242}, NULL) = 0 lstat64("/dev/sem.ofdxuP", 0xbfb1aa7c) = -1 ENOENT (No such file or directory) open("/dev/sem.ofdxuP", O_RDWR|O_CREAT|O_EXCL, 04) = 3 write(3, "\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 16 mmap2(NULL, 16, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = 0xb7fb5000 link("/dev/sem.ofdxuP", "/dev/sem.ciao") = 0 fstat64(3, {st_mode=S_IFREG|04, st_size=16, ...}) = 0 unlink("/dev/sem.ofdxuP") = 0 close(3) = 0 fstat64(1, {st_mode=S_IFREG|0644, st_size=4567, ...}) = 0 mmap2(NULL, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e2c000 write(1, "valore 0", 8valore 0) = 8 munmap(0xb7e2c000, 131072) = 0 exit_group(0) = ? Process 9857 detached
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
[edit] errore
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 06-06-2006 alle 08:07. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Ah ho visto l'arcano...ho un tmpfs montato su /dev, e la mia sem_open ha arbitrariamente deciso di utilizzare il primo tmpfs che ha trovato montato, quindi mi ha scritto i file in.../dev!
Non me ne ero accorto inizialmente.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
sensine come faccio a cambiare i permessi ad un semaforo posix?
Con SV è molto semplice, ma con POSIX mi ci stò perdendo tra strutture complesse ed "opache".. ![]()
__________________
Ciao ~ZeRO sTrEsS~ |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
E' il terzo parametro della sem_open. Al posto delle macro illegibili quali S_IROTH, preferisco usare direttamente il codice ottale, quale ad es. 0644.
Occhio che il valore viene messo in "and" con ~umask. Puoi usare la funzione umask() per cambiare il valore relativamente al processo, se ti serve.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
Intendevo dire, una volta che ho creato il mio semaforo nominato, ora ho due operazioni da fare : 1) Poter cambiare i permessi 2) Fare un listing dei permessi su un semaforo Ora la prima cosa si potrebbe fare in maniera un pò "brutale", cancellando il semaforo e ricreandolo con i permessi scelti, per la seconda, non ho idea dove guardare..
__________________
Ciao ~ZeRO sTrEsS~ |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Visto che è un file, basterebbe cambiare i permessi sul file. Il problema è che, visto il mio "incidente", non è corretto assumere che il semaforo sia locato in /dev/shm.
Per i semafori IPC, i permessi si possono cambiare con semctl. Non so se questa funzione si comporta correttamente anche con i semafori RT, anzi la documentazione dice semplicemente che è "unspecified". Visto però che in genere gli oggetti IPC fanno uso internamente di tecniche simili alla shm, potrebbe funzionare -- prova.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
C'è però un piccolo problema, l'esercizio chiede che si utilizzino solo chiamate posix, in questo modo starei usando strutture System V e semctl che mi pare operi su SV. Credo una soluzione utilizzando solo posix, sarebbe quella di crearsi un file di testo con tutti i nomi dei semafori creati, ogni qual volta mi viene richiesto di cambiare i permessi, cancello l'attuale semaforo e ne ricreo uno con i permessi scelti.. Non mi piace molto ,ma vedo poche vie di uscita, che siano minimamente portabili :\
__________________
Ciao ~ZeRO sTrEsS~ |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Anche semget & co sono POSIX
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
Ecco una parte del codice che ho usato Codice:
struct seminfo seminfo; struct semid_ds semary; struct ipc_perm *ipcp = &semary.sem_perm; union semun arg; int max_id, semid, id = 0; struct passwd *pw; arg.array = (ushort *) (void*) &seminfo; max_id = semctl(0,0,SEM_INFO,arg); printf("------- Semaphores -------\n"); printf("%-10s %-10s %-10s %-10s\n","Key","Semid","Owner","Perms"); for(id = 0;id<=max_id;id++) { arg.buf = (struct semid_ds *) &semary; semid = semctl (id, 0, SEM_STAT, arg); pw = getpwuid(ipcp->uid); printf("%-10d %-10d %-10.10s %-10o\n",ipcp->__key,semid,pw->pw_name,ipcp->mode & 0777); ipcp->mode = (unsigned short) 0777; printf("\n%10o\n",ipcp->mode & 0777); }
__________________
Ciao ~ZeRO sTrEsS~ |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Se non usi IPC_SET non vedo come possa cambiare...
Dove hai trovato documentati SEM_INFO e SEM_STAT? Non le vedo nella manpage...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:53.