Bonjour,

J'ai un petit soucis avec le signal SIGCHLD et je comprend pas d'ou ça vient

Le programme que je lance est tout simple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
#!/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.

+ 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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
....
signal(SIGCHLD, titi);
....
void titi(int sig)
{
	return;
}
...
J'ai bien le code 0

+ 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