【问题标题】:C - Command line interpreterC - 命令行解释器
【发布时间】:2018-04-13 22:13:04
【问题描述】:

我正在实施一个命令行解释器作为大学作业。我得到命令字符串,然后我必须在子进程中分叉并执行命令。这是我的代码示例:

do
{
    if (argc == 1)
    {
        do
        {
            do
            {   
                printf("prompt>> ");
                line = get_string();
            }while(strcmp(line, "") == 0 || line[0] == ';');

        if ( (pid = fork()) < 0 )
        {
            perror("error in forking.");
            exit(1);
        }
        else if (pid == 0)
        {
            // execute the commands with format: cmd1 ; cmd2 ; cmd3
            line_1 = strtok(line, NULL);
            if ( strcmp(line_1, "quit")
            {
                flag = 1;
            }

        }
        else
        {
            printf("...mother proccess...\n");
        }
        while ( (wpid = wait(&stat)) > 0)
    }while(status);
}
}while(something);

如果我有一个quit 命令格式为cmd1 ; cmd2; cmd3 的命令,我必须执行所有命令然后退出程序,而与quit 命令在命令格式中的位置无关。如果我发现退出,我已设法执行所有命令并将 flag 变量设置为 1。问题是如果在所有命令执行完成后flag == 1 我无法退出我的程序。我尝试通过使用父母的 id 从孩子发送SIGTERM 信号,但 id 不起作用。我怎么能这样做?

【问题讨论】:

  • 让母进程解析命令,然后才fork
  • 通常你通过调用exit来退出你的程序。你试过吗?你确定flag已经设置了吗? if ( strcmp(line, "quit") 的格式似乎不正确,可能无法执行您认为应该执行的操作。请不要在发布问题时输入您的代码。而是从实际的可构建代码中复制和粘贴。
  • 我在if-clase 中放置了一个printf 语句来检查quit 并检查它是否在放置quit 命令时得到它。我的实际代码行数太多,这就是我试图缩小它的原因。
  • 缩小代码是可以的,但不能在进程中破坏它。请生成minimal reproducible example。
  • 你不想strcmp(line_1 ...吗?或strstr(line, "quit")?

标签: c shell


【解决方案1】:

您需要检查父进程中是否存在退出。 然后,您可以分叉并使用 wait() 来等待您的子进程终止,然后正常退出。 甚至直接分叉退出。

【讨论】:

  • 检查母进程中是否存在quit 为我完成了这项工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2023-03-06
  • 2012-09-26
相关资源
最近更新 更多