Does this multiple pipes code in C makes sense?

后端 未结 5 1545
暖寄归人
暖寄归人 2020-12-18 13:39

I\'ve created a question about this a few days. My solution is something in the lines of what was suggested in the accepted answer. However, a friend of mine came up with th

5条回答
  •  死守一世寂寞
    2020-12-18 14:08

    This is my "final" code with ephemient suggestions:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define NUMPIPES 5
    #define NUMARGS 10
    
    int main(int argc, char *argv[]) {
        char *bBuffer, *sPtr, *aPtr = NULL, *pipeComms[NUMPIPES], *cmdArgs[NUMARGS];
        int newPipe[2], oldPipe[2], pCount, aCount, i, status;
        pid_t pid;
    
        using_history();
    
        while(1) {
            bBuffer = readline("\e[1;31mShell \e[1;32m# \e[0m");
    
            if(!strcasecmp(bBuffer, "exit")) {
                return 0;
            }
    
            if(strlen(bBuffer) > 0) {
                add_history(bBuffer);
            }
    
            sPtr = bBuffer;
            pCount = -1;
    
            do {
                aPtr = strsep(&sPtr, "|");
    
                if(aPtr != NULL) {
                    if(strlen(aPtr) > 0) {
                        pipeComms[++pCount] = aPtr;
                    }
                }
            } while(aPtr);
    
            cmdArgs[++pCount] = NULL;
    
            for(i = 0; i < pCount; i++) {
                aCount = -1;
    
                do {
                    aPtr = strsep(&pipeComms[i], " ");
    
                    if(aPtr != NULL) {
                        if(strlen(aPtr) > 0) {
                            cmdArgs[++aCount] = aPtr;
                        }
                    }
                } while(aPtr);
    
                cmdArgs[++aCount] = NULL;
    
                // do we have a next command?
                if(i < pCount-1) {
                    pipe(newPipe);
                }
    
                pid = fork();
    
                if(pid == 0) {
                    // do we have a previous command?
                    if(i > 0) {
                        close(oldPipe[1]);
                        dup2(oldPipe[0], 0);
                        close(oldPipe[0]);
                    }
    
                    // do we have a next command?
                    if(i < pCount-1) {
                        close(newPipe[0]);
                        dup2(newPipe[1], 1);
                        close(newPipe[1]);
                    }
    
                    // execute command...
                    execvp(cmdArgs[0], cmdArgs);
                    exit(1);
                } else {
                    // do we have a previous command?
                    if(i > 0) {
                        close(oldPipe[0]);
                        close(oldPipe[1]);
                    }
    
                    // do we have a next command?
                    if(i < pCount-1) {
                        oldPipe[0] = newPipe[0];
                        oldPipe[1] = newPipe[1];
                    }
    
                    // wait for last command process?
                    if(i == pCount-1) {
                        waitpid(pid, &status, 0);
                    }
                }
            }
        }
    
        return 0;
    }
    

    Is it ok now?

提交回复
热议问题