C 为什么';子对象是否在fork()之后执行?它永远不会影响孩子';这是代码的一部分。

C 为什么';子对象是否在fork()之后执行?它永远不会影响孩子';这是代码的一部分。,c,linux,fork,pid,C,Linux,Fork,Pid,这是我的密码。我主要想创建一个子进程,通过execvp()执行一些命令。然而,该程序从来没有达到那里,因为它从来没有打印“得到孩子”。我不明白为什么。有人能解释一下错误是什么吗?因为我想我是按照程序去t pid_t pid; pid = fork(); if (pid < 0) { //if fork() returns less than 1 it failed fprintf(stderr, "fork failed"); re

这是我的密码。我主要想创建一个子进程,通过execvp()执行一些命令。然而,该程序从来没有达到那里,因为它从来没有打印“得到孩子”。我不明白为什么。有人能解释一下错误是什么吗?因为我想我是按照程序去t

    pid_t pid;
    pid = fork();

    if (pid < 0) { //if fork() returns less than 1 it failed
        fprintf(stderr, "fork failed");
        return 1;
    }
    else if (pid == 0) {  //for() returns 0 then this is the child process
        printf("Got to child");
        int exec;
        exec = execvp(args[0], args); /* (2) invoke execvp() */
        if (exec < 0) {
            printf("Error: executing command failed.\n");
            exit(1);
        }
    }
    else { //pid>0 therefore this is the parent process
        if (background == 0){
        wait(&status);
        printf("Got to parent");
        }
    }
pid\u t pid;
pid=fork();
如果(pid<0){//if fork()返回的值小于1,则失败
fprintf(标准“fork failed”);
返回1;
}
否则,如果(pid==0){//for()返回0,则这是子进程
printf(“接触儿童”);
int exec;
exec=execvp(args[0],args);/*(2)调用execvp()*/
if(exec<0){
printf(“错误:执行命令失败。\n”);
出口(1);
}
}
else{//pid>0因此这是父进程
如果(背景==0){
等待(&状态);
printf(“到达母公司”);
}
}

这看起来像典型的模式,但我想知道

printf("Got to child");

没有\n会导致在执行时丢弃未写入的缓冲区,因此没有输出。

这看起来像典型的模式,但我想知道

printf("Got to child");

没有\n会导致在执行时丢弃未写入的缓冲区,因此没有输出。

您不会看到
Got to child
,因为您没有在消息末尾包含换行符。如果添加新行,您可能会突然看到消息。如果您希望合理地确保看到输出,请在消息末尾使用换行符。如果您想更确定地执行此操作,请添加
fflush(stdout)
fflush(0)


您不需要测试
execvp()
中的返回值。它只有在不成功时才会返回。您应该将错误消息报告给标准错误,而不是标准输出。

您不会看到
转到子项
,因为消息末尾没有包含换行符。如果添加新行,您可能会突然看到消息。如果您希望合理地确保看到输出,请在消息末尾使用换行符。如果您想更确定地执行此操作,请添加
fflush(stdout)
fflush(0)


您不需要测试
execvp()
中的返回值。它只有在不成功时才会返回。您应该将错误消息报告给标准错误,而不是标准输出。

请发布有效的可编译代码。此外,请删除与问题无关的代码。更改后,请确保它仍然编译,并再现问题…在printf中添加换行符或刷新它。请发布有效的可编译代码。此外,请删除与问题无关的代码。更改后,请确保它仍然编译并再现问题…在printf中放入新行或刷新它。@user3217278这不是魔术,它被称为“行缓冲”:-)。请参阅`setbuf(3)`了解更多详细信息。@user3217278这不是魔术,它被称为“行缓冲”:-)。更多细节请参见`setbuf(3)`了解。实际上,我总是执行
fflush(NULL)
在任何
fork
execve
@BasileStarynkevitch
fflush(NULL)
之前,刷新所有打开的流以进行写入…听起来是个好主意。实际上我总是执行
fflush(NULL)
在任何
fork
execve
@BasileStarynkevitch
fflush(NULL)
之前,刷新所有打开的流以进行写入…听起来是个好主意。