Bonjour,

J'écris une interface graphique pour controler jack, un serveur de son sous nux, et j'ai un ptit problème. Pour lancer jack, je passe par un double fork() pour éviter les zombie quand je tue le processus plus tard. Cependant je n'arrive pas a récupérer le pid du jack que j'ai lancer puisque ce pid est déclarer dans le premier fils que j'ai lancer (jack est lancer dans le deuxième évidement). Voici la méthode que j'ai écrite :
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
bool
JackDriver::start_up_server(std::string path, std::string command)
{
    while (command.find(" ") == 0) {
        command = command.substr(1);
    }
    std::string argv = command.substr(command.find(" ") + 1);
 
    const pid_t fork_error = vfork ();
 
    if (fork_error == 0) {
        pid_t jack_pid;
 
        struct rlimit max_fds;
        getrlimit (RLIMIT_NOFILE, &max_fds);
 
        for (rlim_t fd = 3; fd < max_fds.rlim_cur; ++fd) {
            close (fd);
        }
 
        jack_pid = fork ();
 
        if (jack_pid == 0) {
            setsid ();
            execl (path.c_str(), argv.c_str(), NULL);
            _exit (-1);
        } else {
            _exit (0);
        }
    } else {
        if (fork_error < 0) {
            std::cout << "Unable to fork() ..." << std::endl;
 
            return false;
        }
    }
 
    _mutex->lock();
    _pid = jack_pid;
    _mutex->unlock();
    std::cout << _pid << std::endl;
 
    return true;
}
Comme le premier fils et mon programme ne partage plus le même espace mémoire, _pid = jack_pid; ne fonctionne pas ...

Je cherhce une solution sans passer par un fichier temporaire ou tout autre chose d'externe, enfin ci c'est possible...

Merci d'avance

~~ Édit :
La solution est un pipe entre l'appli et le premier processus fils.