помочь с созданием оболочки Linux с помощью C - PullRequest
1 голос
/ 25 ноября 2010

Я должен создать оболочку linux, используя C. Ниже мой код:

#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;
}

Все правильно, когда я тестирую код, используя разные команды, такие как "ls", "man" и т. Д., Но когда я использую блокнот для создания тестового файла, содержащего следующее:

echo "hello"
exit 2

код возврата получается 512, когда он должен быть просто 2. Может кто-нибудь помочь мне исправить мой код?

Ответы [ 4 ]

4 голосов
/ 25 ноября 2010

status не является кодом выхода;он также содержит другую информацию.Обычно возвращаемое значение находится в битах 8-15 status, но вы должны использовать макросы в wait.h для извлечения возвращаемого значения из status переносимым способом.2<<8.

4 голосов
/ 25 ноября 2010

Убедитесь, что вы используете макросы, такие как WIFEXITED и WEXITSTATUS для вашего значения status.См. Справочную страницу вашей операционной системы для waitpid. Здесь - описание требований POSIX для waitpid.

0 голосов
/ 25 ноября 2010

Попробуйте заключить в строку command, которую вы поставите, /bin/sh кавычки, потому что в противном случае символ пробела заставляет /bin/sh думать, что вы предоставляете другую опцию самой оболочке, а не команде, которую вы вызываете.Например, попробуйте это в терминале:

/bin/sh -c exit 2
echo $?

и

/bin/sh -c "exit 2"
echo $?

Первый дает 0, а второй дает желаемый 2.

0 голосов
/ 25 ноября 2010

Под блокнотом вы подразумеваете, что используете программу Windows для создания сценария оболочки Unix? Это не работает, потому что вы в конечном итоге с CRLF в конце каждой строки вместо LF. Попробуйте выполнить команду «dos2unix» в сценарии, чтобы преобразовать ее в формат Unix, а затем запустите.

Я полагаю, вы знаете, что код уже доступен в вызове system () из библиотеки? Судя по названию вашей функции, я думаю, вы просто пытаетесь научиться делать это с помощью системных вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...