Shell Redirection导致无限打印到终端

时间:2016-01-31 11:47:33

标签: c shell redirect

所以我在C中编写了一个可以执行STDOUT重定向的简单shell。我正在从用户那里读取一个字符串,将其拆分为参数,然后将其提供给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 包括我的主要内容:

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重定向的命令工作正常。

1 个答案:

答案 0 :(得分:1)

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