OVH Cloud OVH Cloud

[FreeBSD] signaux / memoire partagé

2 réponses
Avatar
SoULiAne
Bonjour, je vous écrit ici parsqu'après avoir posté sur fr.comp.lang.c
on m'a dit qu'il valait mieux posté mes questions sur le groupe consacré
au sytème utilisé (ici FreeBSD). Le but de ces question est de m'aider à
concevoir la partie interactive et l'historique d'un mini-shell... Les
voici donc :


1) Peut-on gérer les signaux de façon à ce que lorsqu'on tape ctrl-c
le(s) caractere(s) ^C ne s'affiche pas dans la console ?

2) Peut-on modifier le comportement du programme lorsque l'on tape
sur ctrl-d ? On m'a dit que ça n'envoyait pas un signal mais un eof
sur l'entree standard du processus... Donc je peux pas faire ça avec
signal ou sigaction ? Mais j'en ai absolument besoin ! ... :/

3) Y'a t'il un meilleur moyen que printf("\a") pour emettre un beep
systeme ?

4) Existe t'il une fonction qui renvoie le user home directory ?

5) J'ai plusieurs processus (les instances du mini-shell) qui
travaillent avec un segment de memoire partagé (pour l'historique des
commandes). Ils y ont tous acces en lecture / ecriture et dans
ce segment ils manipulent la copie d'un fichier. Attention il n'y a
pas de synchronisation entre la memoire et le disque, c'est le
premier processus a se lancer qui cree le segment et y copie le
fichier, puis le dernier a s'arreter qui se chargera de recopier le
contenu de la memoire dans le fichier, sans se soucier de savoir
s'il a ete modifie ou non. Le probleme c'est que je voudrais que
tous les processus puissent instantanement acceder aux deux
variables qui contiennent le nombre de caracteres et de lignes du
"fichier en memoire", ainsi qu'à l'offset du premier caractere de
chaque ligne... Je ne sais pas trop comment faire, utiliser une partie
du segment pour stocker une adresse vers un tableau... un autre segment
de memoire partage mais je ne pourrait alors pas changer sa taille...


Merci :)

2 réponses

Avatar
Jacques Caron
Salut,

On Thu, 30 Dec 2004 15:53:38 +0100, SoULiAne wrote:

1) Peut-on gérer les signaux de façon à ce que lorsqu'on tape ctrl-c
le(s) caractere(s) ^C ne s'affiche pas dans la console ?


A ma connaissance c'est le shell qui l'affiche, donc si ton shell ne
l'affiche pas...

2) Peut-on modifier le comportement du programme lorsque l'on tape
sur ctrl-d ? On m'a dit que ça n'envoyait pas un signal mais un eof
sur l'entree standard du processus... Donc je peux pas faire ça avec
signal ou sigaction ? Mais j'en ai absolument besoin ! ... :/


cf man stty, man termios. Il suffit de changer le caractère affecté à EOF
et éventuellement le mode du terminal.

4) Existe t'il une fonction qui renvoie le user home directory ?


Suivant le contexte, soit tu l'auras dans $HOME, soit il faudra récupérer
cette info via getpwent (ou getpwnam ou getpwuid).

5) J'ai plusieurs processus (les instances du mini-shell) qui
travaillent avec un segment de memoire partagé (pour l'historique des
commandes). Ils y ont tous acces en lecture / ecriture


Ne pas oublier de mettre un moyen de synchro entre les instances (par
exemple un sémaphore), sinon si un processus lit la shm pendant que
l'autre la modifie, ça risque de ne pas être très beau...

Le probleme c'est que je voudrais que
tous les processus puissent instantanement acceder aux deux
variables qui contiennent le nombre de caracteres et de lignes du
"fichier en memoire", ainsi qu'à l'offset du premier caractere de
chaque ligne... Je ne sais pas trop comment faire, utiliser une partie
du segment pour stocker une adresse vers un tableau... un autre segment
de memoire partage mais je ne pourrait alors pas changer sa taille...


La ça n'a vraiment rien de spécifique à FreeBSD, c'est purement une
question de programmation de base et de structuration de l'information en
mémoire. Suivant que tu soies prêt à imposer des limites prédéfinies à
certains paramètres (par exemple le nombre de lignes) ou pas, c'est plus
ou moins simple...

Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/

Avatar
DINH Viêt Hoà

1) Peut-on gérer les signaux de façon à ce que lorsqu'on tape ctrl-c
le(s) caractere(s) ^C ne s'affiche pas dans la console ?

2) Peut-on modifier le comportement du programme lorsque l'on tape
sur ctrl-d ? On m'a dit que ça n'envoyait pas un signal mais un eof
sur l'entree standard du processus... Donc je peux pas faire ça avec
signal ou sigaction ? Mais j'en ai absolument besoin ! ... :/

3) Y'a t'il un meilleur moyen que printf("a") pour emettre un beep
systeme ?


ncurses répond aux 3 questions.

1 et 2) getch(), il faut regarder les exemples qui désactivent l'écho.
3) beep().

--
DINH V. Hoa,

"emacs, c'est génial" -- Arsunique