为什么用 exec() 重新启动程序不能正常工作?
Why restarting program with exec() doesn't work as it should?
我的任务是创建简单的程序以通过命令 exec() 重新启动自身。
在每个调用程序应该将字符串从键盘分配给全局数组(最多 20 个字符)和
在分配之前和之后以十六进制形式打印数组的内容。
问题是在每次调用中我的输出都在 scanf 之后结束(好像程序在打印整个输出之前开始重新启动)。
示例输出:
HEX:49|4e|49|54
Type sentence:
example
HEX:49|4e|49|54
Type sentence
等
有趣的是程序只有在输入 END 后才能正确打印出来。
感谢大家的帮助。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
char global_tab[20] = { "INIT" };
int main ( int argc, char** argv )
{
printf ( "HEX:" );
for ( int i = 0; i < 20; i++ )
{
if ( !global_tab[ i ] ) break;
if ( global_tab[ i + 1 ] ) printf ( "%0x|" , global_tab[ i ] );
else printf ( "%0x" , global_tab[ i ] );
}
printf ( "\nType sentence:\n" );
scanf ( "%s" , global_tab );
printf ( "HEX2:" );
for ( int i = 0; i < 20; i++ )
{
if ( !global_tab[ i ] ) break;
if ( global_tab[ i + 1 ] ) printf ( "%0x|" , global_tab[ i ] );
else printf ( "%0x" , global_tab[ i ] );
}
if ( !strcmp (( const char* ) global_tab , "END." )) return 0;
execve(argv[0], argv, NULL);
return 0;
}
默认情况下缓冲标准输出。 printf
所做的只是将数据写入与 stdout
关联的缓冲区。在缓冲区已满或将换行符写入缓冲区之前,不会发生任何其他事情(如果 stdout
是行缓冲的,如果它指向终端,通常是行缓冲的。
您可以使用 setvbuf
更改 stdout
的缓冲方式。 (有关详细信息,请参阅 man setvbuf
。)或者您可以使用 fflush
强制刷新缓冲区。 (有关详细信息,请参阅 man fflush
。)或者您至少可以写一个换行符,这使您有机会刷新缓冲区,尽管如果您已将 stdout
重定向到文件或管道。 (不过,这是一个好习惯。你应该尝试总是用换行符终止你的输出。编写 printf 格式 start 用换行符是一种代码味道。)
如果你不安排stdout
缓冲区实际发送,那么当你调用execve
时它就会消失。可能这就是本作业旨在教给您的部分内容。
我的任务是创建简单的程序以通过命令 exec() 重新启动自身。 在每个调用程序应该将字符串从键盘分配给全局数组(最多 20 个字符)和 在分配之前和之后以十六进制形式打印数组的内容。 问题是在每次调用中我的输出都在 scanf 之后结束(好像程序在打印整个输出之前开始重新启动)。 示例输出:
HEX:49|4e|49|54
Type sentence:
example
HEX:49|4e|49|54
Type sentence
等 有趣的是程序只有在输入 END 后才能正确打印出来。
感谢大家的帮助。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
char global_tab[20] = { "INIT" };
int main ( int argc, char** argv )
{
printf ( "HEX:" );
for ( int i = 0; i < 20; i++ )
{
if ( !global_tab[ i ] ) break;
if ( global_tab[ i + 1 ] ) printf ( "%0x|" , global_tab[ i ] );
else printf ( "%0x" , global_tab[ i ] );
}
printf ( "\nType sentence:\n" );
scanf ( "%s" , global_tab );
printf ( "HEX2:" );
for ( int i = 0; i < 20; i++ )
{
if ( !global_tab[ i ] ) break;
if ( global_tab[ i + 1 ] ) printf ( "%0x|" , global_tab[ i ] );
else printf ( "%0x" , global_tab[ i ] );
}
if ( !strcmp (( const char* ) global_tab , "END." )) return 0;
execve(argv[0], argv, NULL);
return 0;
}
默认情况下缓冲标准输出。 printf
所做的只是将数据写入与 stdout
关联的缓冲区。在缓冲区已满或将换行符写入缓冲区之前,不会发生任何其他事情(如果 stdout
是行缓冲的,如果它指向终端,通常是行缓冲的。
您可以使用 setvbuf
更改 stdout
的缓冲方式。 (有关详细信息,请参阅 man setvbuf
。)或者您可以使用 fflush
强制刷新缓冲区。 (有关详细信息,请参阅 man fflush
。)或者您至少可以写一个换行符,这使您有机会刷新缓冲区,尽管如果您已将 stdout
重定向到文件或管道。 (不过,这是一个好习惯。你应该尝试总是用换行符终止你的输出。编写 printf 格式 start 用换行符是一种代码味道。)
如果你不安排stdout
缓冲区实际发送,那么当你调用execve
时它就会消失。可能这就是本作业旨在教给您的部分内容。