【问题标题】:Adding custom flag to CAT command in MINIX在MINIX中为CAT命令添加自定义标志
【发布时间】:2019-08-09 03:50:38
【问题描述】:

我正在尝试修改 MINIX 3.2.1 中的 cat 命令,但遇到了一些问题。我想添加-H 标志,以便在使用时,在其内容之前打印文件名。我在 cat.c 中添加了一些代码(参考原始行号):

第 64 行(Hflag 变量):

int Hflag, bflag, eflag, fflag, lflag, nflag, sflag, tflag, vflag;

第 85 行('H' 大小写):

        case 'H':
            Hflag = 1;
            break;
        case 'b':

第 130 行(Hflag 参数):

if (Hflag || bflag || eflag || nflag || sflag || tflag || vflag)

第 142 行(添加 fprintf 以确保确实将 cat.c 添加到重新编译的 MINIX):

fprintf(stdout, "new line\n");
FILE *fp;

第 157 行(应该打印文件名的行):

fprintf(stdout, "%s\n", *argv);
filename = *argv++;

问题是重新编译后(/usr/src 中的make build),cat 似乎无法识别新的-H 标志。如果我输入

# cat -H .exrc

我明白了

cat: unknown option -- H

但是,如果我输入

# cat -b .exrc

I get
new line
.exrc
1  set autoindent autowrite report=2 showmatch

所以cat 实际上已经改变了,因为我得到了“新行”行和“.exrc”行(看起来我应该把它放在if 条件中,但无论如何),但-H 是无法识别。

我做错了什么?我实际上需要做什么才能添加新标志?提前致谢。

【问题讨论】:

    标签: c minix


    【解决方案1】:

    由于 Minix 中的 cat 使用 getopt,您还需要在 getopt 调用中添加一个新选项(其中列出了所有可能的选项)。

    您提供的代码没有这样做。您也可以咨询man getopt

    【讨论】:

    • 这是 minix,不是 linux,用户空间是 BSDish,所以没有 getopt_long。只需getopt
    • 我看过它,但不幸的是,它并没有让事情变得更容易。据我了解,getopt 在 optstring 中查找字母。为了使 -H 标志起作用,我找到了这个 optstring 并在那里添加了 'H' 字母。我对么?如果是这样,我可以在哪个源文件中找到 toptstring 来修改它?
    • @BEEETHvcw 您的第一部分是正确的,您需要修改 optstring。我不知道 cat 的 minix 版本在哪里定义它,你可能只是在 repo 中 grep。
    • 哦,我很笨。一直以来,它就在我眼前,隐藏在第 83 行的显眼位置:while ((ch = getopt(argc, argv, "beflnstuv")) != -1)。我现在正在重新编译 MINIX,希望它能工作。
    最近更新 更多