Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[FreeBSD 8] sig_info.pid

28 réponses
Avatar
JKB
Bonjour à tous,

Petite question du samedi matin ;-) J'ai l'impression que j'ai levé
un lièvre qui me semble assez gros dans FreeBSD 8-STABLE i386 et
concernant sig_info->pid qui vaut toujours 0 chez moi alors qu'il
devrait indiquer le PID du processus ayant envoyé le signal à
traiter. Il était correctement renseigné dans 7.x. Le problème me semble
gros et j'aimerais savoir avant d'aller mettre les pattes dans la libc si
je suis le seul à observer ce genre de problème où si ça vient de
mon installation. En fait, ce qui m'inquiète, c'est que l'équipe de
FreeBSD a mis ce bug en priorité basse alors qu'il doit poser de
sérieux problèmes !

Pour information, le bug report est le
<http://www.freebsd.org/cgi/query-pr.cgi?pr=141956&cat=>
si vous avez plus d'information...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.

8 réponses

1 2 3
Avatar
talon
JKB wrote:

On va encore pouvoir discuter des signaux moisis de FreeBSD et
troller longtemps. Effectivement, le problème de siginfo a été
résolu. Mais mon programme tourne toujours en rond. Cette fois-ci,
c'est la fonction pthread_kill qui ne fait rien, exemple minimal à
l'appui :

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>

void
handler(int signal, siginfo_t *siginfo, void *context)
{
printf("%d %dn", siginfo->si_pid, getpid());
exit(0);
}

int
main(void)
{
int ios;
struct sigaction sa;
struct sigaction osa;

sa.sa_sigaction = handler;
sa.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;

sigaction(SIGABRT, &sa, &osa);
ios = pthread_kill(pthread_self(), SIGABRT);
printf("<%d>n", ios);
return 0;
}
[ ~]# ./a.out
<0>



Je ne vois pas de pthread_create dans ton programme, donc comment ça
pourrait marcher?

Une variante (programmée avec les pieds) fait ce qu'il faut:


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>

void
handler(int signal, siginfo_t *siginfo, void *context)
{
printf("%d %dn", siginfo->si_pid, getpid());
exit(0);
}

void *send_signal(void * arg)
{
int ios;
ios = pthread_kill(pthread_self(), SIGABRT);
printf("<%d>n", ios);
}


int
main(void)
{
struct sigaction sa;
struct sigaction osa;
pthread_t th;
void *ret;

sa.sa_sigaction = handler;
sa.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;

sigaction(SIGABRT, &sa, &osa);
pthread_create(&th, NULL, send_signal,NULL);
(void)pthread_join(th,&ret);
return 0;
}


niobe% cc toto.c -lpthread
niobe% ./a.out
0 31076

Ce coup ci le handler de signaux est bien appelé et produit si_pid et
getpid(). Il est possible que si_pid soit faux, je suis sur une 7.1.





--

Michel TALON
Avatar
Bruno Ducrot
On 2010-02-01, JKB wrote:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>

void
handler(int signal, siginfo_t *siginfo, void *context)
{
printf("%d %dn", siginfo->si_pid, getpid());
exit(0);
}

int
main(void)
{
int ios;
struct sigaction sa;
struct sigaction osa;

sa.sa_sigaction = handler;
sa.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;

sigaction(SIGABRT, &sa, &osa);
ios = pthread_kill(pthread_self(), SIGABRT);
printf("<%d>n", ios);
return 0;
}
[ ~]# ./a.out
<0>
[ ~]#

Étonnant, non ?



Normalement il faut compiler avec '-lpthread'.

test_pthread_kill.c contient le source que tu as poste.

~/c> gcc test_pthread_kill.c
~/c> ./a.out
<0>
~/c> gcc test_pthread_kill.c -lpthread
~/c> ./a.out
0 12835

Par contre, siginfo->si_pid vaut 0 avec pthread_kill(), tandis que ca
marche bien avec kill() (ou abort()) :(

Je pense qu'il faut faire la meme modif qui a ete faite pour kill()
dans le noyau (plus precisement dans sys/kern/sig_kern.c).

Je viens de tester cette modif (a priori, quelqu'un a du s'apercevoir
qu'il y avait un probleme) :

fetch http://people.freebsd.org/~bruno/kern_thr__thr_kill-siginfo_fix.diff
cd /usr/src
patch < ~bruno/kern_thr__thr_kill-siginfo_fix.diff
cd /usr/obj/usr/src/sys/GENERIC
make && make install

Et apres reboot, cette fois-ci on a bien :
~/c> ./a.out
1425 1425

A plus,

--
Bruno Ducrot

-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
Avatar
JKB
Le 01-02-2010, ? propos de
Re: [FreeBSD 8] sig_info.pid,
Michel Talon ?crivait dans fr.comp.os.bsd :
JKB wrote:

On va encore pouvoir discuter des signaux moisis de FreeBSD et
troller longtemps. Effectivement, le problème de siginfo a été
résolu. Mais mon programme tourne toujours en rond. Cette fois-ci,
c'est la fonction pthread_kill qui ne fait rien, exemple minimal à
l'appui :

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>

void
handler(int signal, siginfo_t *siginfo, void *context)
{
printf("%d %dn", siginfo->si_pid, getpid());
exit(0);
}

int
main(void)
{
int ios;
struct sigaction sa;
struct sigaction osa;

sa.sa_sigaction = handler;
sa.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;

sigaction(SIGABRT, &sa, &osa);
ios = pthread_kill(pthread_self(), SIGABRT);
printf("<%d>n", ios);
return 0;
}
[ ~]# ./a.out
<0>



Je ne vois pas de pthread_create dans ton programme, donc comment ça
pourrait marcher?

Une variante (programmée avec les pieds) fait ce qu'il faut:


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>

void
handler(int signal, siginfo_t *siginfo, void *context)
{
printf("%d %dn", siginfo->si_pid, getpid());
exit(0);
}

void *send_signal(void * arg)
{
int ios;
ios = pthread_kill(pthread_self(), SIGABRT);
printf("<%d>n", ios);
}


int
main(void)
{
struct sigaction sa;
struct sigaction osa;
pthread_t th;
void *ret;

sa.sa_sigaction = handler;
sa.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;

sigaction(SIGABRT, &sa, &osa);
pthread_create(&th, NULL, send_signal,NULL);
(void)pthread_join(th,&ret);
return 0;
}


niobe% cc toto.c -lpthread
niobe% ./a.out
0 31076



siginfo->si_pid à 0 ?

Ce coup ci le handler de signaux est bien appelé et produit si_pid et
getpid(). Il est possible que si_pid soit faux, je suis sur une 7.1.



Sur une 7.2, mon exemple fonctionne. Sur une 8 à jour, ça ne
fonctionne plus.

Au passage, rien ne m'empêche d'utiliser pthread_self() sur un
processus qui n'a d'autre thread que le thread principal et qui n'a
jamais appelé pthread_create(). Ça fonctionne parfaitement sur tous
les autres Unix que j'ai sous la main et c'est une régression depuis
la 7.2.

La question est donc : FreeBSD suit-il les specs ou tous les autres
Unix sont-ils dans l'erreur ?

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
Bruno Ducrot
On 2010-02-01, JKB wrote:
Sur une 7.2, mon exemple fonctionne. Sur une 8 à jour, ça ne
fonctionne plus.

Au passage, rien ne m'empêche d'utiliser pthread_self() sur un
processus qui n'a d'autre thread que le thread principal et qui n'a
jamais appelé pthread_create(). Ça fonctionne parfaitement sur tous
les autres Unix que j'ai sous la main et c'est une régression depuis
la 7.2.

La question est donc : FreeBSD suit-il les specs ou tous les autres
Unix sont-ils dans l'erreur ?



Je ne sais pas pour les autres Unix, mais ne pas linker avec la
bibliotheque pthread peut entrainer des UB sous FreeBSD.

A plus,

--
Bruno Ducrot

-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
Avatar
Bruno Ducrot
On 2010-02-01, JKB wrote:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>

void
handler(int signal, siginfo_t *siginfo, void *context)
{
printf("%d %dn", siginfo->si_pid, getpid());
exit(0);
}

int
main(void)
{
int ios;
struct sigaction sa;
struct sigaction osa;

sa.sa_sigaction = handler;
sa.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;

sigaction(SIGABRT, &sa, &osa);
ios = pthread_kill(pthread_self(), SIGABRT);
printf("<%d>n", ios);
return 0;
}
[ ~]# ./a.out
<0>
[ ~]#

Étonnant, non ?



Normalement il faut compiler avec '-lpthread'.

test_pthread_kill.c contient le source que tu as poste.

~/c> gcc test_pthread_kill.c
~/c> ./a.out
<0>
~/c> gcc test_pthread_kill.c -lpthread
~/c> ./a.out
0 12835

Par contre, siginfo->si_pid vaut 0 avec pthread_kill(), tandis que ca
marche bien avec kill() (ou abort()) :(

Je pense qu'il faut faire la meme modif qui a ete faite pour kill()
dans le noyau (plus precisement dans sys/kern/kern_sig.c).

Je viens de tester cette modif (a priori, quelqu'un a du s'apercevoir
qu'il y avait un probleme) :

fetch http://people.freebsd.org/~bruno/kern_thr__thr_kill-siginfo_fix.diff
cd /usr/src
patch < ~bruno/kern_thr__thr_kill-siginfo_fix.diff
cd /usr/obj/usr/src/sys/GENERIC
make && make install

Et apres reboot, cette fois-ci on a bien :
~/c> ./a.out
1425 1425

A plus,

--
Bruno Ducrot

-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
Avatar
JKB
Le 01-02-2010, ? propos de
Re: [FreeBSD 8] sig_info.pid,
Bruno Ducrot ?crivait dans fr.comp.os.bsd :
On 2010-02-01, JKB wrote:
Sur une 7.2, mon exemple fonctionne. Sur une 8 à jour, ça ne
fonctionne plus.

Au passage, rien ne m'empêche d'utiliser pthread_self() sur un
processus qui n'a d'autre thread que le thread principal et qui n'a
jamais appelé pthread_create(). Ça fonctionne parfaitement sur tous
les autres Unix que j'ai sous la main et c'est une régression depuis
la 7.2.

La question est donc : FreeBSD suit-il les specs ou tous les autres
Unix sont-ils dans l'erreur ?



Je ne sais pas pour les autres Unix, mais ne pas linker avec la
bibliotheque pthread peut entrainer des UB sous FreeBSD.



Mon code complet est naturellement lié avec la libpthread.

Je viens de passer votre patch et j'ai enfin un système fonctionnel.

Merci de m'avoir supporté ;-)

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
Bruno Ducrot
On 2010-02-01, JKB wrote:
Le 01-02-2010, ? propos de
Re: [FreeBSD 8] sig_info.pid,
Bruno Ducrot ?crivait dans fr.comp.os.bsd :
On 2010-02-01, JKB wrote:
Sur une 7.2, mon exemple fonctionne. Sur une 8 à jour, ça ne
fonctionne plus.

Au passage, rien ne m'empêche d'utiliser pthread_self() sur un
processus qui n'a d'autre thread que le thread principal et qui n'a
jamais appelé pthread_create(). Ça fonctionne parfaitement sur tous
les autres Unix que j'ai sous la main et c'est une régression depuis
la 7.2.

La question est donc : FreeBSD suit-il les specs ou tous les autres
Unix sont-ils dans l'erreur ?



Je ne sais pas pour les autres Unix, mais ne pas linker avec la
bibliotheque pthread peut entrainer des UB sous FreeBSD.



Mon code complet est naturellement lié avec la libpthread.

Je viens de passer votre patch et j'ai enfin un système fonctionnel.



Je vais faire en sorte que ce patch soit present dans STABLE dans un mois,
environ. Probleme de MFC, tout ca, quoi.

Merci de m'avoir supporté ;-)



C'est plutot a toi d'etre remercie. C'est si rare de nos jours de voir
des devs qui, non seulement se soucient de la portabilite de leur code,
mais en plus reportent les bugs lorsque le systeme est en vrac.

A plus,

--
Bruno Ducrot

-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
Avatar
JKB
Le 01-02-2010, ? propos de
Re: [FreeBSD 8] sig_info.pid,
Bruno Ducrot ?crivait dans fr.comp.os.bsd :
On 2010-02-01, JKB wrote:
Le 01-02-2010, ? propos de
Re: [FreeBSD 8] sig_info.pid,
Bruno Ducrot ?crivait dans fr.comp.os.bsd :
On 2010-02-01, JKB wrote:
Sur une 7.2, mon exemple fonctionne. Sur une 8 à jour, ça ne
fonctionne plus.

Au passage, rien ne m'empêche d'utiliser pthread_self() sur un
processus qui n'a d'autre thread que le thread principal et qui n'a
jamais appelé pthread_create(). Ça fonctionne parfaitement sur tous
les autres Unix que j'ai sous la main et c'est une régression depuis
la 7.2.

La question est donc : FreeBSD suit-il les specs ou tous les autres
Unix sont-ils dans l'erreur ?



Je ne sais pas pour les autres Unix, mais ne pas linker avec la
bibliotheque pthread peut entrainer des UB sous FreeBSD.



Mon code complet est naturellement lié avec la libpthread.

Je viens de passer votre patch et j'ai enfin un système fonctionnel.



Je vais faire en sorte que ce patch soit present dans STABLE dans un mois,
environ. Probleme de MFC, tout ca, quoi.

Merci de m'avoir supporté ;-)



C'est plutot a toi d'etre remercie. C'est si rare de nos jours de voir
des devs qui, non seulement se soucient de la portabilite de leur code,
mais en plus reportent les bugs lorsque le systeme est en vrac.



Oui, mais ça peut énerver à la longue, d'autant plus que je ne suis
pas toujours sûr de ce que j'écris... ;-)

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
1 2 3