【问题标题】:Shell Redirection causes infinite printing to terminalShell 重定向导致终端无限打印
【发布时间】:2016-05-08 21:32:41
【问题描述】:

所以我正在用 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;
    }
}

EDIT 修正了代码中的一个错字,没什么大不了的。 编辑 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 重定向的命令可以正常工作。

【问题讨论】:

  • 也许是colde调用这个函数的问题?我能发现的唯一错误是您在从未打开/初始化过的父进程中关闭了fd
  • @mata,因为我正在分叉,父母是否也得到了文件的副本?编辑:添加了我的主要内容。
  • @meta 似乎确实解决了问题,但我的问题仍然存在:父母是否也得到了文件的副本?
  • @Akaitenshi:父母怎么可能知道他的孩子在做什么? fd 在父进程中关闭它时有一些随机值。删除该行。这是错误的。
  • @nsilent22 看来我被误导了.. 感谢您的帮助:)

标签: c shell redirect


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2014-06-18
    • 1970-01-01
    • 2016-11-23
    • 2014-07-28
    • 2013-10-07
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多