exec传入无效命令时子进程行为存在差异的原因是什么
问题成因解答
这个现象和printf的缓冲机制、execvp的执行逻辑直接相关:
- 默认情况下,终端场景下的标准输出(stdout)为行缓冲模式,只有遇到换行符
\n、缓冲区被填满、或者主动调用fflush(stdout)时,缓冲区中的内容才会真正输出到屏幕上。 - 子进程中执行的
printf("why does this only print when an invalid command is supplied?");语句末尾没有换行符,输出的内容会暂时存在用户态的stdio缓冲区中,不会立刻打印。
有效命令场景(execvp调用成功)
execvp执行成功后,会完全替换当前子进程的整个用户地址空间,存放输出内容的stdio缓冲区也会随着地址空间替换被销毁,还没来得及刷出的缓冲内容直接被清空,因此看不到这句printf的输出。
无效命令场景(execvp调用失败)
execvp执行失败后不会替换进程地址空间,程序会继续向下执行后续的printf ("exec: %s\n", strerror(errno));语句,这句末尾携带的\n会触发stdout缓冲区刷新,之前存在缓冲区里的内容也会一起被打印到屏幕上,因此能看到对应的输出。
修复方案
你只需要给子进程里的第一句printf末尾加上换行符\n,或者在printf后主动调用fflush(stdout),就能在两种场景下都看到这句输出。
内容的提问来源于stack exchange,提问作者Fluctuation10111
相关产品推荐
相关产品推荐

