OVH Cloud OVH Cloud

sem_open(3) et FBSD 5.2...

5 réponses
Avatar
Eric Jacoboni
Salut,

Voilà un bout de code archi classique (censé se synchroniser avec un
autre code, qui affiche pong) :

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#include <stdio.h>
#include <semaphore.h>

int main(void) {

sem_t *dis_ping, *dis_pong;

dis_ping = sem_open("/ping.sem", O_CREAT, 0777, 1);
dis_pong = sem_open("/pong.sem", O_CREAT, 0777, 0);

for(;;) {
sem_wait(dis_ping);
puts("Ping...");
sem_post(dis_pong);
}

sem_close(dis_ping);
sem_close(dis_pong);

return 0;
}
-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-

Ce code compile comme une fleur sous Darwin et s'exécute
parfaitement.

Par contre, sous FBSD 5.x, gcc commence par se plaindre qu'il ne
connait pas O_CREAT... ça commence mal car cela ne correspond pas à ce
qui est spécifié dans la page de man. Bon, admettons, j'ajoute un
#include <fcntl.h>...

Là, ça compile, mais l'exécution se plante avec :

$ ./ping.exe
zsh: invalid system call (core dumped) ./ping.exe

Donc, je suis preneur de toute suggestion... Je viens de tester sur
Solaris (les plateformes implémentant sem_open() ne sont pas légion)
et ça marche très bien aussi...

--
Éric Jacoboni, né il y a 1379543113 secondes

5 réponses

Avatar
talon
Eric Jacoboni wrote:

Là, ça compile, mais l'exécution se plante avec :

$ ./ping.exe
zsh: invalid system call (core dumped) ./ping.exe

Donc, je suis preneur de toute suggestion... Je viens de tester sur
Solaris (les plateformes implémentant sem_open() ne sont pas légion)
et ça marche très bien aussi...


iTu vas dans /sys/modules/sem puis tu fais make et kldload sem.ko
Ensuite:
asmodee% cc -o truc truc.c
asmodee% ./truc
Ping...
^C

--
Éric Jacoboni, né il y a 1379543113 secondes


--
Michel Talon

Avatar
Eric Jacoboni
writes:

Tu vas dans /sys/modules/sem puis tu fais make et kldload sem.ko
Ensuite:
asmodee% cc -o truc truc.c
asmodee% ./truc
Ping...


Ouaip... En fait, le support des semaphores P1003_1B n'est pas active
par defaut...

Dans /sys/conf/NOTES (j'aurai pu chercher longtemps...), on peut lire:

# p1003_1b_semaphores are very experimental,
# user should be ready to assist in debugging if problems arise.
options P1003_1B_SEMAPHORES

Bref, en recompilant le noyal avec cette option, ca marche (l'erreur
concernant O_CREAT subsiste, mais c'est un moindre mal).

Merci a toi et a Xavier,
--
Éric Jacoboni, né il y a 1379548211 secondes

Avatar
Thierry Thomas
Vendredi 06 février 2004 à 22:54 GMT, Eric Jacoboni a écrit :

Bref, en recompilant le noyal avec cette option, ca marche (l'erreur
concernant O_CREAT subsiste, mais c'est un moindre mal).


<mode chipoteur>
On ne peut même pas réellement dire que ce soit une erreur : si on ne
veut pas inclure sys/fcntl.h, on peut toujours utiliser des 0x0200 au
lieu des O_CREAT / O_EXCL, de même que pour éviter d'inclure sys/stat.h
tu as utilisé 777 au lieu des S_IRUSR / S_IWUSR.
<mode oubli de fermeture>

Mais c'est vrai le man pourrait au moins renvoyer à sem(4), qui lui dit
bien quelle option est nécessaire pour sem_open...
--
Th. Thomas.

Avatar
Eric Jacoboni
Thierry Thomas writes:

Mais c'est vrai le man pourrait au moins renvoyer à sem(4), qui lui
dit bien quelle option est nécessaire pour sem_open...


D'autant que sur les autres systemes testes (Solaris et Darwin), cette
inclusion n'est pas necessaire...

--
Éric Jacoboni, né il y a 1379584732 secondes

Avatar
DINH Viêt Hoà

writes:

Tu vas dans /sys/modules/sem puis tu fais make et kldload sem.ko
Ensuite:
asmodee% cc -o truc truc.c
asmodee% ./truc
Ping...


Ouaip... En fait, le support des semaphores P1003_1B n'est pas active
par defaut...


effectivement, on allait oublier l'arrivée de KSE dans l'histoire ...

par contre, sous darwin, c'est sem_init() qu'il manque T.T .

--
DINH Viêt Hoà