【问题标题】:Fork failing in C叉在C中失败
【发布时间】:2017-07-01 23:32:21
【问题描述】:

我在用于为学校项目创建终端的函数中运行 fork 时遇到问题。

当用户输入命令时调用这个函数来处理用户输入:

void handleExternalCommands(char ** arr)
{
    pid_t pid;

    pid = fork();

    printf("pid is ", (long) pid);

    if (pid == -1)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if (pid == 0)
    {
        int status = execvp(arr[0], arr);

        printf("im in the child process");

        if (status == -1)
        {
            // error handle
        }

    }

    wait();
}

但是,无论我输入什么,我实际上都无法在 if 语句中输入它。如果我尝试使用以下方法找出 pid 发生了什么:

printf(pid);

我收到分段错误错误?

提前感谢大家的帮助。

更新:

我已将代码更改为上面的代码。打印 pid 只发生一次,它什么也不打印:“pid is”

【问题讨论】:

  • 如果 fork 失败,您可以轻松确定原因。 if( pid == -1 ) perror("fork");
  • printf(pid) 不打印pid,除非pid 是一个没有格式化字符的字符串。阅读printf() 的文档。
  • 如果execvp() 有效,则printf() 永远不会执行。如果 (a) 您在末尾添加了换行符并且 (b) execvp() 失败,您只会看到来自 printf() 的消息。 (好的:即使没有换行符,您最终也可能会看到它,但换行符是个好主意。)将 printf() 移动到 execvp() 之前并(肯定)添加换行符,您应该会看到信息。
  • 因为你不是这样使用printf()...
  • 我已将代码修改为上面的内容。打印 pid 读取,“pid is”。而且它只打印一次。这是什么意思?

标签: c fork pid


【解决方案1】:

如果execvp() 有效,则printf() 永远不会执行。如果(a)您在末尾添加了换行符并且(b)execvp() 失败,您只会看到来自printf() 的消息。 (好的:即使没有换行符,您最终也可能会看到它,但换行符是个好主意。)

printf() 移动到execvp() 之前并(肯定)添加换行符,您应该会看到信息。另请参阅 printf() anomaly after fork(),但请注意,您会遇到不同的后果,即不使用换行符终止 printf() 输出。

关于printf(pid)崩溃,你需要阅读printf()上的手册 并添加编译器选项,以便您了解错误使用。

你可能需要:

printf("PID %d\n", pid);

假设pid_tint 充分兼容,不会遇到麻烦——这是一个适度安全的假设,但可以通过编写来避免:

printf("PID %d\n", (int)pid);

(或使用int pid; 作为定义)。但关键是你需要正确使用printf()execvp()除非失败才会返回。

【讨论】:

  • 太棒了。谢谢你这么简洁的回答。我想我现在意识到了我的错误,我的问题是特定于我的程序的实现,而不是因为 fork 失败了。谢谢你的帮助。
  • 虽然fork()会失败,但是比较少见。通常,假设问题出在您自己的代码中,而不是系统中——您正确的次数远远多于错误的次数。 (即使fork() 失败,大多数情况下是因为您的程序有问题,而不是系统故障。)
猜你喜欢
  • 2016-04-17
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2015-02-04
相关资源
最近更新 更多