Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
gilles civario wrote:Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Voici ce que j'ai réussit à pondre, répondant en gros à mes besoins :
(lorsque j'ai posé ma question j'avais déjà tout, sauf le nouvel appel
à la fonction signaldans le handler lui-même)
void sig_act(int val) {
fprintf(stderr,"coucoun");
signal(SIGUSR1,sig_act);
}
gilles civario wrote:
Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Voici ce que j'ai réussit à pondre, répondant en gros à mes besoins :
(lorsque j'ai posé ma question j'avais déjà tout, sauf le nouvel appel
à la fonction signaldans le handler lui-même)
void sig_act(int val) {
fprintf(stderr,"coucoun");
signal(SIGUSR1,sig_act);
}
gilles civario wrote:Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Voici ce que j'ai réussit à pondre, répondant en gros à mes besoins :
(lorsque j'ai posé ma question j'avais déjà tout, sauf le nouvel appel
à la fonction signaldans le handler lui-même)
void sig_act(int val) {
fprintf(stderr,"coucoun");
signal(SIGUSR1,sig_act);
}
gilles civario writes:gilles civario wrote:Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Voici ce que j'ai réussit à pondre, répondant en gros à mes besoins :
(lorsque j'ai posé ma question j'avais déjà tout, sauf le nouvel appel
à la fonction signaldans le handler lui-même)
void sig_act(int val) {
fprintf(stderr,"coucoun");
signal(SIGUSR1,sig_act);
}
Ce n'est pas une bonne idée!
Le programme pourrait être en train de fprintf(stderr,un_tres_long_message);
et alors le coucou se mélangerait au millieu d'un_tres_long_message.
Le mieux est de se contenter dans les handlers de positionner un flag
qui sera lu dans la boucle principale du programme.
static int recu_sig_usr1=0;
void sig_act(int val) {
recu_sig_usr1=1;
signal(SIGUSR1,sig_act);
}
int main(int ac, char** av) {
set_signal_USR1(); /* les initialisation viennent ici! */
printf("dans le mainn");
{
int i;
for (i=1; i!=(20*19)/2; ++i){
^^^^^^^^
if(recu_sig_usr1){
recu_sig_usr1=0;
fprintf(stderr,"coucoun");
}
sleep(1); /* ou fprintf(stderr,un_tres_grand_message); */
}
}
printf("fini!n");
return 0;
}
En général on écrit main comme ça:
int status=0;
int main(int ac, char** av) {
intialisations();
travail();
terminaisons();
return(status);
}
gilles civario <gilles.civario@c_e_a.fr> writes:
gilles civario wrote:
Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Voici ce que j'ai réussit à pondre, répondant en gros à mes besoins :
(lorsque j'ai posé ma question j'avais déjà tout, sauf le nouvel appel
à la fonction signaldans le handler lui-même)
void sig_act(int val) {
fprintf(stderr,"coucoun");
signal(SIGUSR1,sig_act);
}
Ce n'est pas une bonne idée!
Le programme pourrait être en train de fprintf(stderr,un_tres_long_message);
et alors le coucou se mélangerait au millieu d'un_tres_long_message.
Le mieux est de se contenter dans les handlers de positionner un flag
qui sera lu dans la boucle principale du programme.
static int recu_sig_usr1=0;
void sig_act(int val) {
recu_sig_usr1=1;
signal(SIGUSR1,sig_act);
}
int main(int ac, char** av) {
set_signal_USR1(); /* les initialisation viennent ici! */
printf("dans le mainn");
{
int i;
for (i=1; i!=(20*19)/2; ++i){
^^^^^^^^
if(recu_sig_usr1){
recu_sig_usr1=0;
fprintf(stderr,"coucoun");
}
sleep(1); /* ou fprintf(stderr,un_tres_grand_message); */
}
}
printf("fini!n");
return 0;
}
En général on écrit main comme ça:
int status=0;
int main(int ac, char** av) {
intialisations();
travail();
terminaisons();
return(status);
}
gilles civario writes:gilles civario wrote:Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Voici ce que j'ai réussit à pondre, répondant en gros à mes besoins :
(lorsque j'ai posé ma question j'avais déjà tout, sauf le nouvel appel
à la fonction signaldans le handler lui-même)
void sig_act(int val) {
fprintf(stderr,"coucoun");
signal(SIGUSR1,sig_act);
}
Ce n'est pas une bonne idée!
Le programme pourrait être en train de fprintf(stderr,un_tres_long_message);
et alors le coucou se mélangerait au millieu d'un_tres_long_message.
Le mieux est de se contenter dans les handlers de positionner un flag
qui sera lu dans la boucle principale du programme.
static int recu_sig_usr1=0;
void sig_act(int val) {
recu_sig_usr1=1;
signal(SIGUSR1,sig_act);
}
int main(int ac, char** av) {
set_signal_USR1(); /* les initialisation viennent ici! */
printf("dans le mainn");
{
int i;
for (i=1; i!=(20*19)/2; ++i){
^^^^^^^^
if(recu_sig_usr1){
recu_sig_usr1=0;
fprintf(stderr,"coucoun");
}
sleep(1); /* ou fprintf(stderr,un_tres_grand_message); */
}
}
printf("fini!n");
return 0;
}
En général on écrit main comme ça:
int status=0;
int main(int ac, char** av) {
intialisations();
travail();
terminaisons();
return(status);
}
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
gilles civario writes:Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
En fait, les processus que je souhaite interroger grace au signal seront
gilles civario <gilles.civario@c_e_a.fr> writes:
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
En fait, les processus que je souhaite interroger grace au signal seront
gilles civario writes:Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
En fait, les processus que je souhaite interroger grace au signal seront
Jean-Marc Bourguet wrote:gilles civario writes:Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
En fait, les processus que je souhaite interroger grace au signal
seront lancés en batch. Donc leurs sortie standard en erreur sera
déjà connectée à un fichier. Je ne peux donc pas écrire dessus car
je vais la polluer. J'avais en tête un truc du style fifo, créé
dans le handler, et sur lequel le processus faisant le kill -USR1
lirait. Sauf que je n'y connais rien en matière de pipe nommé,
socket and co... Y a-t-il de l'espoire de ce coté là ?
Jean-Marc Bourguet wrote:
gilles civario <gilles.civario@c_e_a.fr> writes:
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
En fait, les processus que je souhaite interroger grace au signal
seront lancés en batch. Donc leurs sortie standard en erreur sera
déjà connectée à un fichier. Je ne peux donc pas écrire dessus car
je vais la polluer. J'avais en tête un truc du style fifo, créé
dans le handler, et sur lequel le processus faisant le kill -USR1
lirait. Sauf que je n'y connais rien en matière de pipe nommé,
socket and co... Y a-t-il de l'espoire de ce coté là ?
Jean-Marc Bourguet wrote:gilles civario writes:Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
En fait, les processus que je souhaite interroger grace au signal
seront lancés en batch. Donc leurs sortie standard en erreur sera
déjà connectée à un fichier. Je ne peux donc pas écrire dessus car
je vais la polluer. J'avais en tête un truc du style fifo, créé
dans le handler, et sur lequel le processus faisant le kill -USR1
lirait. Sauf que je n'y connais rien en matière de pipe nommé,
socket and co... Y a-t-il de l'espoire de ce coté là ?
Pascal Bourguignon wrote:gilles civario writes:gilles civario wrote:Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Voici ce que j'ai réussit à pondre, répondant en gros à mes besoins :
(lorsque j'ai posé ma question j'avais déjà tout, sauf le nouvel appel
à la fonction signaldans le handler lui-même)
void sig_act(int val) {
fprintf(stderr,"coucoun");
signal(SIGUSR1,sig_act);
}
Ce n'est pas une bonne idée!
Le programme pourrait être en train de
fprintf(stderr,un_tres_long_message); et alors le coucou se
mélangerait au millieu d'un_tres_long_message.
Et m***, je n'avais pas pensé à ça.Le mieux est de se contenter dans les handlers de positionner un flag
qui sera lu dans la boucle principale du programme.
static int recu_sig_usr1=0;
void sig_act(int val) {
recu_sig_usr1=1;
signal(SIGUSR1,sig_act);
}
int main(int ac, char** av) {
set_signal_USR1(); /* les initialisation viennent ici! */
printf("dans le mainn");
{
int i;
for (i=1; i!=(20*19)/2; ++i){
^^^^^^^^
J'ai beaucoup aimé ça, ça m'a bien fait rire
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Au final, ce que je souhaite réaliser, c'est une petite commande
lisant les compteurs hardware de la machine, pour afficher au run-time
des information sur un processus en cour. Or l'appel à la routine
de lecture des compteurs hardware ne peut se faire que par le processus
lui-même. D'où l'idée de passer par un signal handler.
Quelqu'un a une meilleure idée (je suis preneur de toute suggestion).
Pascal Bourguignon wrote:
gilles civario <gilles.civario@c_e_a.fr> writes:
gilles civario wrote:
Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Voici ce que j'ai réussit à pondre, répondant en gros à mes besoins :
(lorsque j'ai posé ma question j'avais déjà tout, sauf le nouvel appel
à la fonction signaldans le handler lui-même)
void sig_act(int val) {
fprintf(stderr,"coucoun");
signal(SIGUSR1,sig_act);
}
Ce n'est pas une bonne idée!
Le programme pourrait être en train de
fprintf(stderr,un_tres_long_message); et alors le coucou se
mélangerait au millieu d'un_tres_long_message.
Et m***, je n'avais pas pensé à ça.
Le mieux est de se contenter dans les handlers de positionner un flag
qui sera lu dans la boucle principale du programme.
static int recu_sig_usr1=0;
void sig_act(int val) {
recu_sig_usr1=1;
signal(SIGUSR1,sig_act);
}
int main(int ac, char** av) {
set_signal_USR1(); /* les initialisation viennent ici! */
printf("dans le mainn");
{
int i;
for (i=1; i!=(20*19)/2; ++i){
^^^^^^^^
J'ai beaucoup aimé ça, ça m'a bien fait rire
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Au final, ce que je souhaite réaliser, c'est une petite commande
lisant les compteurs hardware de la machine, pour afficher au run-time
des information sur un processus en cour. Or l'appel à la routine
de lecture des compteurs hardware ne peut se faire que par le processus
lui-même. D'où l'idée de passer par un signal handler.
Quelqu'un a une meilleure idée (je suis preneur de toute suggestion).
Pascal Bourguignon wrote:gilles civario writes:gilles civario wrote:Bonjour.
Je souhaiterais installer un gestionnaire de signal spécifique.
Concrètement, j'aimerais qu'avec un kill -USR1 <pid>, un message
s'affiche, et que le process <pid> continue sa route comme si
rien ne s'était produit.
Est-ce possible simplement, et de manière la plus portable possible ?
Si oui, comment faire pour qu'un code déjà existant puisse répondre
au signal de cette manière, sans recompilation ni modification des
sources (mais éventuellement via une édition de liens) ?
Merci.
Bonjour.
Voici ce que j'ai réussit à pondre, répondant en gros à mes besoins :
(lorsque j'ai posé ma question j'avais déjà tout, sauf le nouvel appel
à la fonction signaldans le handler lui-même)
void sig_act(int val) {
fprintf(stderr,"coucoun");
signal(SIGUSR1,sig_act);
}
Ce n'est pas une bonne idée!
Le programme pourrait être en train de
fprintf(stderr,un_tres_long_message); et alors le coucou se
mélangerait au millieu d'un_tres_long_message.
Et m***, je n'avais pas pensé à ça.Le mieux est de se contenter dans les handlers de positionner un flag
qui sera lu dans la boucle principale du programme.
static int recu_sig_usr1=0;
void sig_act(int val) {
recu_sig_usr1=1;
signal(SIGUSR1,sig_act);
}
int main(int ac, char** av) {
set_signal_USR1(); /* les initialisation viennent ici! */
printf("dans le mainn");
{
int i;
for (i=1; i!=(20*19)/2; ++i){
^^^^^^^^
J'ai beaucoup aimé ça, ça m'a bien fait rire
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Au final, ce que je souhaite réaliser, c'est une petite commande
lisant les compteurs hardware de la machine, pour afficher au run-time
des information sur un processus en cour. Or l'appel à la routine
de lecture des compteurs hardware ne peut se faire que par le processus
lui-même. D'où l'idée de passer par un signal handler.
Quelqu'un a une meilleure idée (je suis preneur de toute suggestion).
gilles civario writes:Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
gilles civario <gilles.civario@c_e_a.fr> writes:
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
gilles civario writes:Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
Jean-Marc Bourguet wrote:gilles civario writes:Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
En fait, les processus que je souhaite interroger grace au signal
seront lancés en batch. Donc leurs sortie standard en erreur sera
déjà connectée à un fichier. Je ne peux donc pas écrire dessus car
je vais la polluer. J'avais en tête un truc du style fifo, créé
dans le handler, et sur lequel le processus faisant le kill -USR1
lirait. Sauf que je n'y connais rien en matière de pipe nommé,
socket and co... Y a-t-il de l'espoir de ce coté là ?
Jean-Marc Bourguet wrote:
gilles civario <gilles.civario@c_e_a.fr> writes:
Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
En fait, les processus que je souhaite interroger grace au signal
seront lancés en batch. Donc leurs sortie standard en erreur sera
déjà connectée à un fichier. Je ne peux donc pas écrire dessus car
je vais la polluer. J'avais en tête un truc du style fifo, créé
dans le handler, et sur lequel le processus faisant le kill -USR1
lirait. Sauf que je n'y connais rien en matière de pipe nommé,
socket and co... Y a-t-il de l'espoir de ce coté là ?
Jean-Marc Bourguet wrote:gilles civario writes:Sauf que l'une de mes contraintes (forte), est de ne pas modifier le
code existant. Dans le pire des cas, je pourrais ajouter un appel
de fonction, permettant entre autre de positionner le signal-handler,
mais en aucun cas une autre modification n'est possible.
Donc, y a-t-il un moyen d'écrire sur un canal dont on en sûre qu'il ne
sera pas utilisé par ailleurs, et d'afficher la sortie à l'écran ?
Il n'y a pas de notion d'ecran sous Unix et je vois au moins 3
possibilites: stdout et le terminal controllant le processus
(/dev/tty) et la console du systeme (/dev/console). De toute maniere,
j'ai du mal a voir comment tu vas eviter les interferences possibles.
Si j'ai bonne memoire, POSIX autorise l'utilisation de write dans un
signal (c'est au moins le cas pour solaris, le man indique
Async-Signal-Safe).
En fait, les processus que je souhaite interroger grace au signal
seront lancés en batch. Donc leurs sortie standard en erreur sera
déjà connectée à un fichier. Je ne peux donc pas écrire dessus car
je vais la polluer. J'avais en tête un truc du style fifo, créé
dans le handler, et sur lequel le processus faisant le kill -USR1
lirait. Sauf que je n'y connais rien en matière de pipe nommé,
socket and co... Y a-t-il de l'espoir de ce coté là ?