我正在C.中模拟bash
我在尝试处理某个命令的退出状态代码时遇到了这个问题。
例如:
bash-3.2$ ./asid
bash: ./asid: No such file or directory
bash-3.2$ echo $?
127
bash-3.2$ .
bash: .: filename argument required
.: usage: . filename [arguments]
bash-3.2$ echo $?
2
bash-3.2$
在上面的示例中,当命令execute bash在$?中设置退出状态时?,我正试图在我的代码中模拟同样的行为。
到目前为止我的代码:
int ft_exec(t_simple_cmd *cmd, t_env **head)
{
int pid;
int status;
int f_status;
if (!(pid = fork()))
{
//child_process;
if (execve(cmd->command, ft_args_to_arr(cmd), ft_list_to_arr(head)) == -1)
ft_put_err(cmd->command, ft_strjoin(": ", strerror(errno)), 2);
exit(errno);
}
else if (pid == -1)
{
//error;
ft_putstr_fd("Fork failed.n", 2);
}
else
{
//parent process;
waitpid(pid, &status, 0);
f_status = WEXITSTATUS(status);
return (f_status);
}
return (1);
}
当我在bash中尝试相同的命令时,会得到不同的结果。
如果我理解正确,您最终会将ft_exec(_cmd_, _env_)
的int
返回放入外壳的sh
中的$?
变量。
$?
的POSIX规范施加了许多约束:8位信息、用数字0–125表示的正常进程终止、1–125之间的外壳扩展或重定向错误、调用失败的不可执行文件为126、缺少命令为127以及信号死亡大于128。
考虑到这一点,这个逻辑:
if (execve(...) == -1) {
exit(errno); // This is incorrect!
}
不能正确。您需要自己将execve
的错误转换为126或127的$?
。