当Child进程调用函数丢失输出时

时间:2010-10-11 03:19:45

标签: c

int handleCommand(char *command) {
    pid_t pid;
    pid = fork();

    if (pid > 0) {
        sleep(0.5);
    } else if (pid == 0) {
        execCommand(command);
        //strcat(path[0], command);
        //printf("%s", path[0]);
        //execve(path[0], path, NULL);
        //printf("\n");
    } else {
        printf("ERROR");
    }

}

int execCommand(char *command) {

    char* path[] = {"/bin/", NULL};
    printf("in execCommand > %s", command );
    strcat(path[0], command);
    execve(path[0], path, NULL);
    printf("\n");
}

首先,你可以看到我将代码直接放在fork发生的函数中。例如,这将显示执行ls命令时预期的输出。但当我把它移动到一个函数时,我不再看到任何输出。

1 个答案:

答案 0 :(得分:1)

首先请注意,如果执行命令,printf()之后的execve()操作永远不会执行 - execve()只会在出错时返回,永远不会成功。

接下来,除非在输出结尾处包含换行符,否则打印将不会刷新到标准输出的终端(并且有些情况,例如将标准输出传送到另一个程序,甚至是换行不一定足以刷新标准输出)。因此,您应该在邮件中添加换行符,并且仍然在fflush(stdout);之前execve()