首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管道和waitpid

管道和waitpid
EN

Stack Overflow用户
提问于 2014-06-13 23:12:50
回答 1查看 265关注 0票数 0

我的管道出了点问题。我浏览了所有的主题,但没有找到任何针对我的问题的内容。

我的管道工作正常,但我想知道我的孩子什么时候终止。所以我想使用waitpid来检查我的孩子。但这并不管用。

我的烟斗:

代码语言:javascript
复制
int interpretiere_pipeline(Kommando k){

    int pipe1[] = { -1, -1 };
    int pipe2[] = { -1, -1 };

    int status, pid, laenge, i;
    Kommando command; 
    Liste l;

    i = 0;
    status = 0;
    laenge = k->u.sequenz.laenge;

    l = k->u.sequenz.liste;


    printf("Anzahl der Elemente der Pipe: %i!\n", laenge);

    while(i < laenge) {
        pipe2[0] = pipe1[0];
        pipe2[1] = pipe1[1];
        command = (Kommando) listeKopf(l);

        if (i > 0) {
            close(pipe2[1]);
        }

        if (pipe(pipe1) < 0) {
            perror("Pipe-Fehler");
            exit(1);
        }
        /* fuehre Kindprozesse aus -> speichere pid */
        pid = fork();

        switch (pid) {
        case -1:
            /* Fehler bei Fork -> Abbruch */
            perror("fork-Fehler");
            exit(1);
        case 0:
            /* Leseströme umlegen auf vorherigen Prozess (außer beim ersten Prozess) */
            if (pipe2[0] != -1) {
                if(dup2(pipe2[0], STDIN_FILENO) == -1){
                    perror("dup2 failed\n");
                    exit(1);
                }
            }

            /* Schreibströme umlegen auf nachfolgenden Prozess (außer beim letzten Prozess) */
            if (i < laenge - 1) {
                if(dup2(pipe1[1], STDOUT_FILENO) == -1){
                    perror("dup2 failed\n");
                    exit(1);
                }
            }

            /* fuehre Kommandos aus */
            interpretiere_einfach(command, 0);
            exit(1);
            break;
        default:
            /* schreibe Prozesse in die Struktur */
            printf("Name : %s\n",command->u.einfach.worte[0]);
            pGlobal = erzeugeProzess( pid, "test", "RUNNING");
            /* fuege Struktur in Liste ein */
            procTable = listeAnfuegen(procTable, &pGlobal);
            /* Zaehler fue while-Schleife*/
            i++;

            sleep(2);
            break;
        }
        l = listeRest(l);
    }

    return status;
}

我的服务生

代码语言:javascript
复制
          waitpid(pid, &kind_status, 0);
            if(WIFEXITED(kind_status)){
                printf("Kind mit der PID %d wurde beendet\n",pid);
                if (WEXITSTATUS(kind_status) == 0) {
                    /** setze status exit(0) */ 
                    /*printf("Kind erfolgreich\n");*/
                    p->status = "exit(0)";
                } 
                /* nicht erfolgreiche ausgeführt */
                else 
                {
                    /** setze status exit(1) */ 
                    /*printf("Kind nicht erfolgreich\n");*/
                    p->status = "exit(1)";
                }
            }
            else if(WIFSIGNALED(kind_status)){
                /*printf("Kind mit der PID %d wurde durch Signal abgebrochen. Signalnummer: %d\n",pid, WTERMSIG(kind_status));*/
                p->status = "signal";
            }
          i = listeLaenge(procTable);
          procTable = listeAnfuegen(procTable, p);
          /*procTable = listeAnfuegen(procTable, &pGlobal);*/
          if(listeLaenge(procTable) <= i) {
            fprintf(stderr, "Fehler beim Schreiben in die Liste!");
          }

我可以把它放在我的管子下面,和管子的长度成一个环吗?

EN

回答 1

Stack Overflow用户

发布于 2014-06-13 23:40:51

无论如何,您必须将所有的子pids存储在某种类型的列表中。所以我建议你像这样做一个循环:

代码语言:javascript
复制
while( /* there are processes to be waited for */ ) {
    pid_t deadpid = waitpid( -1, &kind_status, 0 );
    /* handle kind_status and remove deadpid from the list */
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24208665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档