为什么 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
(或相关函数)等待子进程退出,并能够获取其退出码。
以下建议代码:
- 干净地编译
- 检查错误并报告错误
- 执行所需的功能
- 父进程等待子进程完成
现在,建议的代码:
#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);
}
假设我有以下名为 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
(或相关函数)等待子进程退出,并能够获取其退出码。
以下建议代码:
- 干净地编译
- 检查错误并报告错误
- 执行所需的功能
- 父进程等待子进程完成
现在,建议的代码:
#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);
}