所以我用C编写了一个简单的shell,可以执行STDOUT重定向我正在从用户那里读取一个字符串,将其分成参数,然后将其馈送给exec但是当我第一次重定向输出时:创建我请求的文件并用正确的数据填充它,然后无限地在终端中打印命令结果我对dup2有什么不好吗?
这是我的重定向代码所有使用的变量都是全局变量,除了文件描述符。

int execRedirectCommand(){
    int fd;

    pid_t pid = fork();


    // fork failed
    if(pid == -1){
        char* error = strerror(errno);
        printf("fork: %s\n", error);
        return -1;
    }
    //Child process
    else if(pid == 0){
        fd = open(fileName, O_WRONLY | O_CREAT | O_TRUNC, 0755);
        if(fd == -1){
            char* error = strerror(errno);
            printf("open:%s\n", error);
            return -1;
        }
        dup2(fd, STDOUT_FILENO);
        close(fd);

        execvp(payloadArgv[0], payloadArgv);

        // execvp failed
        char* error = strerror(errno);
        printf("pdsh:%s:%s\n", payloadArgv[0], error);
        return -1;
    }
    // Parent process
    else{
        close(fd);
        fileName = NULL;

        // Wait for child process to finish
        int childStatus;
        waitpid(pid, &childStatus, 0);
        return 0;
    }
}

编辑修复了代码中的一个错别字。
编辑2包括my main:
int main(){
    setSigHandler();
    char* user = getlogin();


    while(1){
        printf("[%s]-->$", user);
        getNextCommand(payload);

        if(!strcmp(payload, "\n")) continue;

        if(!strcmp(payload, "close")) break;


        parseCommandString();


        if(fileName != NULL){
            execRedirectCommand();
        }else{
            execSimpleCommand();
        }


    }

    return 0; }

注意:没有STDOUT重定向的命令可以正常工作。

最佳答案

感谢mata和nsilent22指出这一点不需要父进程中的close(fd)。

关于c - Shell重定向导致无限打印到终端,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35113481/

10-16 11:11