Problème avec le signal SIGCHLD
Bonjour,
J'ai un petit soucis avec le signal SIGCHLD et je comprend pas d'ou ça vient :oops:
Le programme que je lance est tout simple:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <stdio.h>
#include <unistd.h>
#include <signal.h>
static int test();
int main(int argc, char *argv[])
{
test();
usleep(5000000);
}
static int test()
{
int ret;
int localPid = 0;
char *envp2[] = { 0 };
char *argv2[] = { "/tmp/scripts/vars.sh", NULL };
localPid = fork();
if (localPid != 0)
{
return 0;
}
else
{
signal(SIGCHLD, SIG_IGN);
execve("/tmp/scripts/vars.sh", argv2, envp2);
_exit (0);
}
} |
Le shell vars.sh ressemble à ça:
Citation:
#!/bin/sh
set -x
env
su - toto -c "sleep 1"
ERR=$?
echo $ERR
Mon problème c'est qu'en retour du 'su' j'optiens pas le code 0.
Citation:
+ env
PWD=/root/pascal/scripts
SHLVL=1
_=/bin/env
+ su - toto -c 'sleep 1'
+ ERR=223
+ echo 223
223
Par contre, lorsque j'enlève le signal ou je que je défini une fonction pour traité ce signal comme ceci:
Code:
1 2 3 4 5 6 7 8 9
|
....
signal(SIGCHLD, titi);
....
void titi(int sig)
{
return;
}
... |
J'ai bien le code 0
Citation:
+ env
PWD=/root/pascal/scripts
SHLVL=1
_=/bin/env
+ su - toto -c 'sleep 1'
+ ERR=0
+ echo 0
0
Savez-vous pourquoi dans le premier cas j'optiens pas le code 0 alors qu'avec SIG_IGN on est censé ignoré le signal?
Merci pour votre aide