【发布时间】: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”。而且它只打印一次。这是什么意思?