【发布时间】:2013-02-17 06:23:39
【问题描述】:
我正在尝试使用内置命令创建一个基本的 shell,但我遇到了一些关于 getopt 的问题。这是输出(使用 valgrind):
$ mkdir -p foo/bar
mkdir
-p
foo/bar
FLAGON
$ mkdir -p foo/test
mkdir
-p
foo/test
==15377== Invalid read of size 1
==15377== at 0x5201BBE: _getopt_internal_r (in /usr/lib/libc-2.17.so)
==15377== by 0x5202CEA: _getopt_internal (in /usr/lib/libc-2.17.so)
==15377== by 0x5202D37: getopt (in /usr/lib/libc-2.17.so)
==15377== by 0x40351A: shell_ns_cmd_mkdir (shell.c:542)
==15377== by 0x403AB4: normal_shell_cb (shell.c:610)
==15377== by 0x402E8E: shell_mainloop (shell.c:402)
==15377== by 0x401B67: main (main.c:52)
==15377== Address 0x54e0912 is 2 bytes inside a block of size 3 free'd
==15377== at 0x4C2AD3C: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==15377== by 0x402C93: shell_mainloop (shell.c:384)
==15377== by 0x401B67: main (main.c:52)
==15377==
$
这里是来源(剪辑):
for (i = 0; i < argc; i++) {
puts(argv[i]);
}
while ((c = getopt(argc, argv, "p")) != -1) {
switch (c) {
case 'p':
puts("FLAGON");
mkparents = true;
break;
case '?':
fprintf(stderr, "invalid option -- %c", optopt);
ret = 127;
goto end;
break;
}
}
所以它第一次运行时 (mkdir -p) 会识别它 (-p) 而第二次运行时则不会。有什么想法吗?
【问题讨论】:
-
可能是您的标准输出缓冲区由于某种原因第二次没有被刷新?在 puts 之后试试 fflush(stdout)?
-
“它[程序]第一次运行它[程序,或者
getopt()?]识别它”。 它是什么? -
@Code-Guru,对不起,它 和标志一样 (
-p) -
@MiJyn “第二次 it 运行”是什么意思。你的意思是你的程序运行两次还是你的意思是第二次
while循环迭代? (请随时使用这些说明来编辑您的问题。) -
@Code-Guru,对,这是
mkdir命令(我发布了我的源代码)第二次运行。