Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

c'est quoi cette horreur?

1 view
Skip to first unread message

LUONG Olivier

unread,
Jan 3, 2002, 4:09:29 PM1/3/02
to
Bonjour,

En cours unix on a vu la déclaration suivante :
void (*signal(int signum, void (*handler)(int)))(int);

je ne cherche pas a savoir l'utilité pour unix mais ce que celà signifie en
C
car je ne comprends pas l'ecriture...

@ bientot et bonne année à tous
Olivier LUONG

Eric Levenez

unread,
Jan 3, 2002, 5:06:16 PM1/3/02
to
dans l'article 3c34ca7f$0$213$626a...@news.free.fr, LUONG Olivier à
olivie...@free.fr a écrit le 3/01/02 22:09 :

> En cours unix on a vu la déclaration suivante :
> void (*signal(int signum, void (*handler)(int)))(int);

C'est le prototype de la foncion signal qui a deux arguments :

1: int signum
2: void (*handler)(int)

Le premier argument est un entier, le second est l'adresse
d'une fonction. Cette fonction attend elle-même un int (le
numéro du signal) et ne retour rien (void).

La fonction signal de plus retourne l'adresse de l'ancienne
fonction, d'où le (int) en fin et le void au début.

Par contre, on n'utilise plus trop cette fonction car il
y a plus puissant et plus sûr pour la gestion des signaux
posix, dans le genre sigaction.

--
Éric Lévénez - <http://www.levenez.com>


LUONG Olivier

unread,
Jan 4, 2002, 2:01:40 AM1/4/02
to
si la fonction signal prend deux arfument et renvoie un pointeur sur
l'ancienne fonction pourquoi ne pas ecrire :

void (*handler)(int) (*signal)(int signum, void (*handler)(int));
ou peut-etre :
(void (*handler)(int)) (*signal)(int signum, void (*handler)(int));
pour bien marquer que void (*handler)(int) est le type de retour...

ca n'est pas plus simple? c'est sans doute faux... mais bon ca me parait
plus logique qq part...

"Eric Levenez" <er...@levenez.com> a écrit dans le message de news:
B85A9468.5763%er...@levenez.com...


> dans l'article 3c34ca7f$0$213$626a...@news.free.fr, LUONG Olivier à
> olivie...@free.fr a écrit le 3/01/02 22:09 :
>
> > En cours unix on a vu la déclaration suivante :
> > void (*signal(int signum, void (*handler)(int)))(int);
>
> C'est le prototype de la foncion signal qui a deux arguments :
>
> 1: int signum
> 2: void (*handler)(int)
>
> Le premier argument est un entier, le second est l'adresse
> d'une fonction. Cette fonction attend elle-même un int (le
> numéro du signal) et ne retour rien (void).
>
> La fonction signal de plus retourne l'adresse de l'ancienne
> fonction, d'où le (int) en fin et le void au début.

je ne vois pas en quoi un void et un int vont me permettre
d'obtenir l'adresse de l'ancienne fonction?

Tobias Oed

unread,
Jan 4, 2002, 2:18:54 AM1/4/02
to

Tout a fait d'accord, just une addition: En utilisant un
typedef on arrive a reecrire le prototype de signal d'une
maniere lisible:

typedef void sig_handler(int); /* un sig_handler est une fonction
prenant un int en argument et qui ne retourne rien */

sig_handler *signal(int signum,sig_handler *handler); /* signal
instale le sig_handler sur lequel pointe handler pour le
signal nr signum et retourne un pointeur vers l'ancien
sig_handler */

ce qui est tout de meme nettement plus lisible.
Tobias.

Gabriel Dos Reis

unread,
Jan 4, 2002, 10:43:48 AM1/4/02
to
"LUONG Olivier" <olivie...@free.fr> writes:

| si la fonction signal prend deux arfument et renvoie un pointeur sur
| l'ancienne fonction pourquoi ne pas ecrire :
|
| void (*handler)(int) (*signal)(int signum, void (*handler)(int));
| ou peut-etre :
| (void (*handler)(int)) (*signal)(int signum, void (*handler)(int));

Parce que ce n'est pas comme cela n'est pas du C.

| pour bien marquer que void (*handler)(int) est le type de retour...

tu veux dire

typedef void (*handler_t)(int);
handler_t signal(int, handler_t);

?

c'est trop lisible :-)

-- Gaby

Guillaume Rumeau

unread,
Jan 4, 2002, 12:38:48 PM1/4/02
to
Eric Levenez <er...@levenez.com>
a informé le monde le 01/03/02 à 23:06:16 que :


[...]

>
> La fonction signal de plus retourne l'adresse de l'ancienne
> fonction, d'où le (int) en fin et le void au début.
>
> Par contre, on n'utilise plus trop cette fonction car il
> y a plus puissant et plus sûr pour la gestion des signaux
> posix, dans le genre sigaction.

Sauf que signal() est ISO C et que sigaction() est POSIX.

De plus, signal() est tout à fait correct dans un cadre
général. Après, ça dépend de ce que tu veux faire.


--
GR <guillaum...@wanadoo.fr>
http://www.isty-info.uvsq.fr/~rumeau/fclc/

Mieux vaut mourir debout que vivre à genoux

Eric Levenez

unread,
Jan 4, 2002, 1:01:19 PM1/4/02
to
dans l'article 87r8p6c...@wanadoo.fr, Guillaume Rumeau à
guillaum...@wanadoo.fr a écrit le 4/01/02 18:38 :

> Eric Levenez <er...@levenez.com>
> a informé le monde le 01/03/02 à 23:06:16 que :
>

>> Par contre, on n'utilise plus trop cette fonction car il
>> y a plus puissant et plus sûr pour la gestion des signaux
>> posix, dans le genre sigaction.
>
> Sauf que signal() est ISO C et que sigaction() est POSIX.

C'est ce que j'ai dit, non ? Mais bon si tu vas par là
signal c'est ISO 9899 alors que sigaction est ISO 9945-1.

> De plus, signal() est tout à fait correct dans un cadre
> général. Après, ça dépend de ce que tu veux faire.

Moi rien. Je réponds au monsieur en informant qu'il y a
une vie après le "C 100 % pur".

Guillaume Rumeau

unread,
Jan 4, 2002, 2:23:38 PM1/4/02
to
Eric Levenez <er...@levenez.com>
a informé le monde le 01/04/02 à 19:01:19 que :

> dans l'article 87r8p6c...@wanadoo.fr, Guillaume Rumeau à
> guillaum...@wanadoo.fr a écrit le 4/01/02 18:38 :
>
> > Eric Levenez <er...@levenez.com>
> > a informé le monde le 01/03/02 à 23:06:16 que :
> >
> >> Par contre, on n'utilise plus trop cette fonction car il
> >> y a plus puissant et plus sûr pour la gestion des signaux
> >> posix, dans le genre sigaction.
> >
> > Sauf que signal() est ISO C et que sigaction() est POSIX.
>
> C'est ce que j'ai dit, non ?

Alors j'ai mal compris.

> Mais bon si tu vas par là
> signal c'est ISO 9899 alors que sigaction est ISO 9945-1.
>

Hum, oui bon.

> > De plus, signal() est tout à fait correct dans un cadre
> > général. Après, ça dépend de ce que tu veux faire.
>
> Moi rien. Je réponds au monsieur en informant qu'il y a
> une vie après le "C 100 % pur".

Moi je rajoutais juste que signal() peut être utile et préférable à
sigaction(), notamment parce que c'est une fonction du standard C, qui
est plus large que le standard POSIX.

Maintenant, il ne fallait pas le prendre mal, comme tu sembles l'avoir
fait.
J'ai fait une remarque sur un point qu'il me semblait manquer à ta
réponse, rien de plus.

Et pour finir, quand tu dis « qu'il y a une vie après le "C 100 %
pur". » je ne crois pas avoir jamais dis le contraire.

Cordialement,

Eric Levenez

unread,
Jan 4, 2002, 2:56:09 PM1/4/02
to
dans l'article 87advtd...@wanadoo.fr, Guillaume Rumeau à
guillaum...@wanadoo.fr a écrit le 4/01/02 20:23 :

> Moi je rajoutais juste que signal() peut être utile et préférable à
> sigaction(), notamment parce que c'est une fonction du standard C, qui
> est plus large que le standard POSIX.

Et moi je disais juste qu'il vaut mieux utiliser une fonction qui
marche bien qu'une qui marche moins bien (et c'est pour cela que j'ai
bien précisé que c'était posix).

> Maintenant, il ne fallait pas le prendre mal, comme tu sembles l'avoir
> fait.

Pas du tout. Il en faut beaucoup plus que ça :-)

Olivier LUONG

unread,
Jan 4, 2002, 2:58:42 PM1/4/02
to

"Gabriel Dos Reis" <dos...@cmla.ens-cachan.fr> a écrit dans le message
news: fly9jej...@riz.cmla.ens-cachan.fr...

ha vi comme ca c'est limpide :)

Emmanuel Delahaye

unread,
Jan 4, 2002, 4:39:02 PM1/4/02
to
Eric Levenez <er...@levenez.com> wrote in
news:B85A9468.5763%er...@levenez.com:

> dans l'article 3c34ca7f$0$213$626a...@news.free.fr, LUONG Olivier à
> olivie...@free.fr a écrit le 3/01/02 22:09 :
>
>> En cours unix on a vu la déclaration suivante :
>> void (*signal(int signum, void (*handler)(int)))(int);
>
> C'est le prototype de la foncion signal qui a deux arguments :

Non. 'signal' est un pointeur de fonction.

> 1: int signum
> 2: void (*handler)(int)
>
> Le premier argument est un entier, le second est l'adresse
> d'une fonction. Cette fonction attend elle-même un int (le
> numéro du signal) et ne retour rien (void).
>
> La fonction signal de plus retourne l'adresse de l'ancienne
> fonction, d'où le (int) en fin et le void au début.

Non. La fonction pointée par 'signal' retourne void. Personne n'a parlé de
la fonction signal(). Pour le moment, on a qu'un pointeur de fonction qui
s'appelle 'signal'.



> Par contre, on n'utilise plus trop cette fonction car il
> y a plus puissant et plus sûr pour la gestion des signaux
> posix, dans le genre sigaction.

/Irrelevent/ (Comment dit-on en français? Hors de propos?, Inadéquate?)

--
-ed- emdel at noos.fr
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-library: http://www.dinkumware.com/htm_cl/index.html
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Eric Levenez

unread,
Jan 4, 2002, 4:50:58 PM1/4/02
to
dans l'article Xns918CE6C472...@130.133.1.4, Emmanuel Delahaye à
emdel...@noos.fr a écrit le 4/01/02 22:39 :

> Eric Levenez <er...@levenez.com> wrote in
> news:B85A9468.5763%er...@levenez.com:
>
>> dans l'article 3c34ca7f$0$213$626a...@news.free.fr, LUONG Olivier à
>> olivie...@free.fr a écrit le 3/01/02 22:09 :
>>
>>> En cours unix on a vu la déclaration suivante :
>>> void (*signal(int signum, void (*handler)(int)))(int);
>>
>> C'est le prototype de la foncion signal qui a deux arguments :
>
> Non. 'signal' est un pointeur de fonction.

signal est le nom de la fonction. Tu peux tourner ça dans
tous les sens, signal est le nom de la fonction prototypée.
Et une fonction et son adresse, c'est la même chose. D'accord ?

>> 1: int signum
>> 2: void (*handler)(int)
>>
>> Le premier argument est un entier, le second est l'adresse
>> d'une fonction. Cette fonction attend elle-même un int (le
>> numéro du signal) et ne retour rien (void).
>>
>> La fonction signal de plus retourne l'adresse de l'ancienne
>> fonction, d'où le (int) en fin et le void au début.
>
> Non. La fonction pointée par 'signal' retourne void.

C'est ce que j'ai dit. Relis bien ma phrase _jusqu'au bout_,
tu vois le "void" que j'ai écrit ? Hein ? Dis ?

> Personne n'a parlé de
> la fonction signal().

Ce n'est quand même pas sorcier de reconnaître une fonction
très typique par son prototype, et quand en plus on a son
nom, là c'est à la portée de tous, non ?

>> Par contre, on n'utilise plus trop cette fonction car il
>> y a plus puissant et plus sûr pour la gestion des signaux
>> posix, dans le genre sigaction.
>
> /Irrelevent/ (Comment dit-on en français? Hors de propos?, Inadéquate?)

Non, c'est une info intéressante à savoir. J'ai bien précisé
que c'était Posix. Ca te dérange tant que ça ?

Gabriel Dos Reis

unread,
Jan 5, 2002, 1:37:27 AM1/5/02
to
Emmanuel Delahaye <emdel...@noos.fr> writes:

[...]

| > Par contre, on n'utilise plus trop cette fonction car il
| > y a plus puissant et plus sûr pour la gestion des signaux
| > posix, dans le genre sigaction.
|
| /Irrelevent/ (Comment dit-on en français? Hors de propos?, Inadéquate?)

« sans rapport, hors de propos, non pertinent »

En revanche, tu as oublié de jutifier ta remarque.

-- Gaby

0 new messages