PDA

View Full Version : [Posix] Semafori


beppegrillo
03-06-2006, 11:22
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"

NPTL Named Semaphores - is new in NPTL. It will use the tmpfs mounted on
/dev/shm if available. It does not have to exist for semaphores to work. You
can verify this by running the NPTL test suite with and without the /dev/shm
mount. The tst-sem* tests all pass in both scenarios. I'm sure a competent
programmer type could write a simple test case in about 3 minutes to verify
as well. Glibc is literally full of this sort of fallback behaviour. (Mind
you, there are still plenty of other NPTL test failures for some folks, but
that is a different kettle of fish :-)

trallallero
05-06-2006, 11:25
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"

su che "macchina" sei ?
l'errore quando te lo da ?

beppegrillo
05-06-2006, 14:09
su che "macchina" sei ?
l'errore quando te lo da ?
Sono su una macchina linux(slackware), l'errore lo ottengo quando utilizzo la chiamata sem_open.
Se ho montato /dev/shm nessun problema, se invece non lo ho ottengo un "Function not defined"

trallallero
05-06-2006, 14:31
Sono su una macchina linux(slackware), l'errore lo ottengo quando utilizzo la chiamata sem_open.
Se ho montato /dev/shm nessun problema, se invece non lo ho ottengo un "Function not defined"

linux ? non penso di poterti aiutare molto allora.

Io lavoro su Sun Solaris e col codice seguente :


#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);
}



lo compilo lo avvio e apre e chiude il semaforo senza la shm montata.

Ho un client linux ma la sem_open neanche c'e' :(
ma e' un linux versione Flingstones :rolleyes:
mi spiace...

beppegrillo
05-06-2006, 14:58
Grazie del tantatvo, stasera cerco di fare una prova su una knoppix e vediamo che dice. :)

ilsensine
05-06-2006, 16:59
Puoi catturare la strace del programma eseguito con e senza la shm?

beppegrillo
05-06-2006, 18:15
Certo, questo è il 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;
}

Strace con shm

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

beppegrillo
05-06-2006, 18:17
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



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

beppegrillo
05-06-2006, 20:07
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

ilsensine
06-06-2006, 09:00
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:


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

ilsensine
06-06-2006, 09:04
[edit] errore

ilsensine
06-06-2006, 09:15
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.

beppegrillo
06-06-2006, 15:26
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".. :mc:

ilsensine
06-06-2006, 16:15
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.

beppegrillo
06-06-2006, 16:29
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.
si certo scusami, mi sono espresso male.
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..

ilsensine
06-06-2006, 16:49
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.

beppegrillo
06-06-2006, 17:55
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.
Usando cmtl ed emulando un pò ipcs riesco ad ottenere le informazioni sui semafori, compreso i permessi. Ho provato anche a cambiare il campo mode in 0777, ma pare che non cambi nulla.
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 :\

ilsensine
06-06-2006, 18:02
Anche semget & co sono POSIX

beppegrillo
06-06-2006, 18:20
Anche semget & co sono POSIX
Capisco, a stò punto quindi il problema è quello di usare strutture System V.
Ecco una parte del codice che ho usato

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);
}

Viene cambiato, però mi pare non lo sia realmente..

ilsensine
06-06-2006, 18:30
Se non usi IPC_SET non vedo come possa cambiare...

Dove hai trovato documentati SEM_INFO e SEM_STAT? Non le vedo nella manpage...

beppegrillo
06-06-2006, 18:42
Se non usi IPC_SET non vedo come possa cambiare...

Dove hai trovato documentati SEM_INFO e SEM_STAT? Non le vedo nella manpage...
Da man semctl

On failure semctl() returns -1 with errno indicating the error.

Otherwise the system call returns a nonnegative value depending on cmd as follows:

GETNCNT the value of semncnt.

GETPID the value of sempid.

GETVAL the value of semval.

GETZCNT the value of semzcnt.

IPC_INFO the index of the highest used entry in the kernel's internal array recording information about all semaphore sets. (This
information can be used with repeated SEM_STAT operations to obtain information about all semaphore sets on the system.)

SEM_INFO As for IPC_INFO.

SEM_STAT the identifier of the semaphore set whose index was given in semid.

Per IPC_SET, pensavo bastasse sovrascrivere il valore nella struttura, ora ci provo.

ilsensine
07-06-2006, 08:43
SEM_INFO As for IPC_INFO.

SEM_STAT the identifier of the semaphore set whose index was given in semid.

Queste mi mancano...

beppegrillo
07-06-2006, 13:31
Queste mi mancano...
Prova ad aggiornare le manpages :)
SEM_INFO E SEM_STAT, vengono utilizzati anche da ipcs.

ilsensine
07-06-2006, 18:20
Prova ad aggiornare le manpages :)

...faccio un dist-upgrade una volta al giorno :D