使用C创建linux shell的帮助
我应该使用C创建一个linux shell。下面是我的代码:使用C创建linux shell的帮助,c,linux,C,Linux,我应该使用C创建一个linux shell。下面是我的代码: #include <stddef.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #define SHELL "/bin/sh" #include "extern.h" int mysystem (char *command) { int st
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define SHELL "/bin/sh"
#include "extern.h"
int mysystem (char *command)
{
int status;
pid_t pid;
pid = fork ();
if (pid == 0)
{
execl (SHELL, SHELL, "-c", command, NULL);
_exit (EXIT_FAILURE);
}
else if (pid < 0)
status = -1;
else
if (waitpid (pid, &status, 0) != pid)
status = -1;
return status;
}
返回代码应该是512
,而返回代码应该是2
。
有人能帮我修改代码吗?用记事本你的意思是你在用Windows程序创建Unix shell脚本吗?这不起作用,因为你在每一行的末尾都有CRLF,而不是LF。在脚本上尝试“dos2unix”命令,将其转换为Unix格式,然后运行它
我假设您知道system()库调用中已经有代码了?从函数名判断,我猜您只是在尝试学习如何使用系统调用。记事本您的意思是使用Windows程序创建Unix shell脚本吗?这不起作用,因为你在每一行的末尾都有CRLF,而不是LF。在脚本上尝试“dos2unix”命令,将其转换为Unix格式,然后运行它
我假设您知道system()库调用中已经有代码了?从函数名判断,我猜您只是在学习如何使用系统调用。
状态
不是退出代码;它还包含其他信息。通常,返回值位于状态
的第8-15位,但您应该使用等待.h
中的宏以便携方式从状态
提取返回值
注意512是
2状态
不是退出代码;它还包含其他信息。通常,返回值位于状态
的第8-15位,但您应该使用等待.h
中的宏以便携方式从状态
提取返回值
请注意,512是2请确保在状态
值上使用像WIFEXITED
和WEXITSTATUS
这样的宏。有关waitpid
,请参阅操作系统手册页。是关于waitpid
的POSIX要求的描述,请确保在状态值上使用了WIFEXITED
和WEXITSTATUS
等宏。有关waitpid
,请参阅操作系统手册页。是对waitpid
上POSIX要求的描述,请尝试用引号括起您提供给/bin/sh
的命令
字符串,否则空格字符会使/bin/sh
认为您是在为shell本身提供另一个选项,而不是为正在调用的命令。例如,在终端中尝试以下操作:
/bin/sh -c exit 2
echo $?
及
第一个给出了0
,第二个给出了所需的2尝试用引号括起您提供给/bin/sh
的命令字符串,否则空格字符会使/bin/sh
认为您是在为shell本身提供另一个选项,而不是您正在调用的命令。例如,在终端中尝试以下操作:
/bin/sh -c exit 2
echo $?
及
第一个给出了0
,第二个给出了所需的2
谁能帮我编辑我的问题。有些东西不见了。当你在回音“你好”后加上分号时,它能起作用吗?@Amir Afghani:不,它不能起作用。有人能帮我编辑我的问题吗。有些东西不见了。当你在回音“hello”后加上分号时,它能工作吗?@Amir Afghani:不,它不能工作,但当我在终端中/mysystem时,它仍然打印512。它打印512是因为你没有使用WEXITSTATUS宏,正如其他人所指出的那样。尝试将函数的最后一行更改为return WEXITSTATUS(status)
。但是当我在终端中执行/mysystem时,它仍然打印512。正如其他人所指出的,它打印512是因为您不使用WEXITSTATUS宏。尝试将函数的最后一行更改为return WEXITSTATUS(status)
。在system()库调用中,代码已经可用是什么意思?你能告诉我吗?你说代码已经在system()库调用中可用是什么意思?你能给我看看吗?
/bin/sh -c "exit 2"
echo $?