1 votes

Problème mineur avec fork() et pipe()

Je suis en train d'écrire un petit programme qui met en œuvre des tuyaux comme ils fonctionnent dans la shell. ie:

ls -hal | sort | grep p | wc

ça fonctionne bien, avec le léger problème que sur une ligne, lorsque CMD_NO=n, la comparaison i est plus grande que CMD_NO ne fonctionne pas, mais i!=(CMD_NO-1) fonctionne. J'essaie de comprendre pourquoi dans ce cas particulier (la ligne est commentée comme LIGNE PROBLÉMATIQUE dans le code) ces déclarations ne sont pas équivalentes. Merci beaucoup.

#include 
#include 
#include 
#include 
#include 

#define READ_END 0
#define WRITE_END 1
#define CMDS_NO 5

int main (int argc, char **argv) 
{
    pid_t pid;
    int new_fds[2];
    int old_fds[2];

    char *array[CMDS_NO];
    char *param[CMDS_NO];

    array[0]="ls";
    array[1]="sort";
    array[2]="grep";
    array[3]="grep";
    array[4]="wc";

    param[0]="-hal";
    param[1]=NULL;
    param[2]="p";
    param[3]="out";
    param[4]=NULL;

    for (int i=0; i1) {
        close(old_fds[0]);
        close(old_fds[1]);
     }     

     while (1) { //attendre que les processus enfants se terminent
         wait(NULL);
         if(errno== ECHILD) {
             printf("tous les enfants sont terminés\n"); 
             break;
         }
     }

return 0;
}

1voto

Martin B Points 14919

La condition i sera toujours vraie car `i` s'exécute de 0 à `CMDS_NO-1`. Je pense que vous vouliez écrire votre condition comme ``i. Bien sûr, `i!=CMDS_NO-1` est également valide.``

`

Notez que cela affecte plusieurs autres endroits où vous avez if (i; ceux-ci devraient également être lus `if (i.`

``` ````

1voto

Andreas Bonini Points 15709

C'est normal.

for (int i=0; i

``

Cela signifie "boucler tant que i est inférieur à CMDS_NO". Dès que i == CMDS_NO la boucle s'arrêtera; donc, à l'intérieur de la boucle, le plus grand i atteindra jamais est CMDS_NO - 1.

PS: CMDS_NO est un nom de variable vraiment pauvre, appelez-le MAX_COMMANDS par exemple

``

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X