|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1455
|
[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: 1455
|
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: 1455
|
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: 1455
|
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: 1455
|
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: 1455
|
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: 1455
|
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: 1455
|
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: 1455
|
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: 1455
|
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: 13:37.



















