[ncurse+dup2] flux standard non relu sous windows

Résolu/Fermé
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 14 avril 2023 à 15:21
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 2 oct. 2023 à 00:14

Bonjour,

j'ai une solution logiciel qui consiste à ouvrir 50 fenêtre "console" sous windows. C'est un peu pénible à gérer (savoir si une a planté par exemple).

J'ai écris un petit programme en C++ utilisant fork(), dup2() et pipe() afin de rediriger les flux (stdin et stdout) des programmes lancés vers un programme maitre. J'ai une petite interface console (ncurses) qui fonctionne bien sous Linux.

J'ai utilisé MSYS2 pour compiler sous Windows (pas de souci de compil). Mais à l'exécution, les flux ne sont pas du tout redirigé et s'affichent dans la fenêtre principale.

De quel façon peut on rediriger stdout et stdin sous Windows ? où est mon erreur ?

Voici un programme minimal qui fonctionne sous Linux, et qui ne fonctionne pas sous Windaube :

        int pipeOUT[2];
        pipe(pipeOUT);
        pid_t pid=fork();
        if(pid==0)
        {
                dup2(pipeOUT[1],STDOUT_FILENO);
                close(pipeOUT[0]);
                close(pipeOUT[1]);
                execl("/bin/ls","ls","-l",".",0);
        }
        std::cout<<"Process numero "<<pid<<std::endl;
        char buf[5120];
        close(pipeOUT[1]);
        buf[5119]=0;
        while(read(pipeOUT[0],buf,5119)>0)
                std::cout<<buf;

a priori ça serait le dup2 qui ne ferait pas bien son travail ? 


Merci de votre aide.


A voir également:

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 18 avril 2023 à 12:08

Salut Char Sniper,

Désolé, je n'ai pas d'installation Windows fonctionnelle pour tester ton code.

Cependant, dans mes souvenirs, fork() sous Windows ne se comporte pas du tout comme sous Linux, à moins d'utiliser Cygwin pour compiler et exécuter ton programme avec ce runtime (et encore, de mémoire, ce n'est pas parfait).

Une autre solution pour les versions Windows récentes disposant de WSL (Windows Subsystem for Linux) est d'exécuter ton programme dans ce sous-système.

Sinon, la façon de faire "normale" sous Windows est de passer par leurs API win32 avec CreateProcess() et CreatePipe(). Tu as du code d'exemple là :

https://learn.microsoft.com/en-us/windows/win32/procthread/creating-a-child-process-with-redirected-input-and-output

0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
2 oct. 2023 à 00:14

Bonjour,

Merci Dal de ta réponse. J'ai réussi à faire fonctionner le bouzin, je m'y prenait mal.

Mais autant ça fonctionne nickel sous Linux, autant sous win, ça bug dans tout les sens, mais pas franchement :

Des fois le flux est redirigé, des fois non. Le waitpid capture le processus qui meure une fois sur deux. Bref, une cata. J'ai laché l'affaire. Comme tu le dis "ce n'est pas parfait". Msys2 est très similaire à Cygwin, je crois même qu'ils partagent une histoire et du code source.

Et pas envie d'aprendre l'API win, même si c'est la solution la plus logique.


0