C:如何处理bash命令的所有退出代码状态



我正在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的$?

相关内容

  • 没有找到相关文章

最新更新