为什么 execv 在 c 程序中 fork 之后比 printf 慢?

Why is an execv slower than a printf after a fork in a c program?

假设我有以下名为 program.c

的程序
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>


int function(char **argv) {
    pid_t pid = fork();
    if (pid > 0) {
    execv(*argv, argv); 
    }
    
    int value=0;
    return value;
}

int main(int argc, char **argv) {
    int return2;
    
    return2 = function(argv+1);
    printf("%d\n", return2);
}

而我执行的是./program /bin/ls,为什么ls在return2的printf之后才执行?

示例:./program /bin/ls

returns

0 
file1
file2
file3

这与换行符无关(与缓冲区相关),因为即使我从 printf 中删除 \n,行为也是相同的。

我希望 execv 在子​​进程有时间到达 printf 之前立即打印 ls

您的父进程不会等待子进程退出,它会在 fork 调用后立即从 function return 返回到 main,并且然后 main 也会立即完成它所做的事情。

甚至可能父进程在子进程到达 运行 之前完成。

使用wait(或相关函数)等待子进程退出,并能够获取其退出码。

以下建议代码:

  1. 干净地编译
  2. 检查错误并报告错误
  3. 执行所需的功能
  4. 父进程等待子进程完成

现在,建议的代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int function(char **argv) 
{
    pid_t pid = fork();
    if (pid == 0) 
    {  // then child process
        execv(*argv, argv); 
        perror( "execv failed" );
        exit( EXIT_FAILURE );
    }
    
    if( pid < 0 )
    {
        perror( "fork failed" );
        exit( EXIT_FAILURE );
    }
    
    
    //if( pid > 0 )
    // then parent process
    int status;
    waitpid( pid, &status, 0 );
        

    return status;
}

int main(int argc, char **argv) 
{
    int return2;
    
    if( argc < 2 )
    {
        fprintf( stderr, "USAGE: %s cmdToRun\n", argv[0] );
        exit( EXIT_FAILURE );
    }
    
    return2 = function(argv+1);
    printf("%d\n", return2);
}