代码之家  ›  专栏  ›  技术社区  ›  barlop Sandeep

一个C程序演示了cmd.exe和linux shell(如bash)如何定义参数?

  •  1
  • barlop Sandeep  · 技术社区  · 15 年前

    我听说CMDShell将整个东西传递给命令,然后一个标准的C库根据空格和引号对其进行划分。而在linux中,只有shell能做到这一点。

    一个带有while循环的程序,显示argsv[i]显示它是如何被分隔的,而不是shell做了什么,以及C库做了什么。

    有谁能给我指一个能显示出来的程序吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Yusuf Khan    15 年前

    我想你想知道shell在linux中是如何工作的,对吧?我认为当我们在命令shell上键入任何内容时,shell将所有参数作为字符串格式的参数接收,然后shell fork+exec将二进制文件作为环境变量传递给新的二进制文件,这些环境变量随后由内核放入新进程的堆栈中,然后由进程作为argc和argv[]进行访问,但不由c库进行特殊处理。

        2
  •  1
  •   R.. GitHub STOP HELPING ICE    15 年前

    在任何POSIX或类似POSIX的操作系统上,标准库都与将命令行解析为组件无关。这完全是靠壳做的。波塞克斯 exec 函数族接受一个指针数组,就像 main 接收。通常,内核的责任是将这些代码干净地排列并保存在一个特殊的位置(堆栈顶部是典型的位置) 执行官 (当上一个程序的地址空间被删除时)。

    怎样 要做贝壳做的事,只要你读了贝壳做什么的详细解释,就很简单,尽管很痛苦。你可以在这里找到:

    http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

        3
  •  0
  •   Mark Ransom    15 年前

    您认为Windows cmd.exe和Linux shell工作相同的假设是不正确的。试着做 echo * * ,Linux将显示当前目录中的文件列表。

    Windows程序将接收 * 在里面 argv[1] 没有别的了。Linux程序将在 argv ,每个文件都是完整的文件名,包括空格(如果有的话)。

    int main(int argc, char **argv)
    {
        int i;
        for (i = 0;  i < argc;  ++i)
        {
            printf("%d: %s\n", i, argv[i]);
        }
        return 0;
    }