我创建了这个函数,它充当基于终端的应用程序的主菜单:
bool wizard_run() {
char *command = NULL;
bool repeat = false;
bookmark:
terminal_prepare();
terminal_message(MESSAGE_INTRODUCTION);
loop: /* repeat until a valid command */ {
free(command); /* free any previous command */
command = terminal_command(PROMPT_COMMAND, COMMAND_LENGTH, repeat);
if (!strcmp(command, COMMAND_ENCRYPT)) wizard_encrypt();
else if (!strcmp(command, COMMAND_DECRYPT)) wizard_decrypt();
else if (!strcmp(command, COMMAND_CONCEAL)) wizard_conceal();
else if (!strcmp(command, COMMAND_REVEAL)) wizard_reveal();
else if (!strcmp(command, COMMAND_ERASE)) wizard_erase();
else if (!strcmp(command, COMMAND_GENERATE)) wizard_generate();
else if (!strcmp(command, COMMAND_NAVIGATE)) directory_navigate(RDS_HOME)
else if (!strcmp(command, COMMAND_SESSION)) wizard_session();
else if (!strcmp(command, COMMAND_SAFEMODE)) wizard_safemode();
else if (!strcmp(command, COMMAND_HELP)) wizard_help(HELP_MAINMENU)
else if (!strcmp(command, COMMAND_EXIT)) {free(command); return false;}
else {repeat = true; goto loop;}
}
free(command); /* free last command */
return true;
}
所有大写的值都是#defined
常量,除了宏之外...(...)
都是函数(这就是为什么没有分号结束这些行的原因)。wizard_help(...)
directory_navigate(...)
这是应用程序的主要功能:
void main() {
// initialize any Components needed
if (!directory_rdsload()) return;
packager_reset();
// show the Splash Screen
SPLASH();
// continuously execute the Main Thread
while (wizard_run()); /* execution loop */
// perform any Clean-UP needed before exit
reset();
encryption_reset();
directory_reset(is_safemode);
}
在这里,只有SPLASH()
一个宏。
所有布尔值(即true
, false
)都是预定义的 unsigned char 值,而bool
is typedef unsigned char bool;
。
它的正常行为是在用户输入(COMMAND_EXIT 的当前值)wizard_run()
时退出循环,执行然后正常终止应用程序。相反,当我第一次键入时,它会重新显示菜单,当我第二次键入时,它会终止并出现以下错误:exit
reset(); encryption_reset(); directory_reset(is_safemode);
exit
exit
application: cxa_atexit.c:99: __new_exitfn: Assertion `l != ((void *)0)' failed.
Aborted (core dumped)
当程序在 下运行时gdb
,我收到此错误:
application: cxa_atexit.c:99: __new_exitfn: Assertion `l != ((void *)0)' failed.
Program received signal SIGABRT, Aborted.
0xb7fdd424 in __kernel_vsyscall ()
main()
除了调用之外没有其他功能wizard_run()
,因此这不是重新显示菜单而不是退出的原因。有任何想法吗?
提前致谢!!!:D