c - 前叉C失败

扫码查看

我在为学校项目创建终端的函数中运行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”

最佳答案

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

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()除非失败,否则不会返回。

关于c - 前叉C失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44866250/

10-11 23:19
查看更多