使用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

我应该使用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 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 $?