我在为学校项目创建终端的函数中运行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_t
与int
足够兼容,不会遇到麻烦-一个中等安全的假设,但是可以通过编写以下代码来避免这种情况:printf("PID %d\n", (int)pid);
(或使用
int pid;
作为定义)。但是关键是您需要正确使用printf()
,并且execvp()
除非失败,否则不会返回。关于c - 前叉C失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44866250/