extern: команда не найдена - PullRequest
2 голосов
/ 18 июня 2020

Я слежу за этой лабораторной работой из курса Udemy по компьютерной безопасности, который в основном использует C (я думаю) скрипты для демонстраций. После попытки запустить следующую программу на моем собственном компьютере (как в среде Ubuntu, так и в MacOS) я получаю столько ошибок, что кажется, что компилятор даже не знает, на каком языке он читает.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

extern char **environ;

void printenv()
{
  int i = 0;
  while (environ[i] != NULL) {
    printf("%s\n", environ[i]);
    i++;
  }
}

void main()
{
  pid_t childPid;
  switch(childPid = fork()) {
    case 0: /* child process */
      printenv();
      exit(0);
    default: /* parent process */
      //printenv();
      exit(0);
  }
}

Ошибки:

строка 4: extern: команда не найдена
строка 5: синтаксическая ошибка около неожиданного токена '('
строка 5: 'void printenv ()'

Кто-нибудь знает, что происходит? Я не знаком с C (в основном работает в Javascript и Python), но похоже, что все имеет довольно стандартный синтаксис и не должно вызывать ошибок .

1 Ответ

0 голосов
/ 19 июня 2020

следующий предлагаемый код:

  1. чисто компилирует
  2. выполняет желаемую функциональность
  3. не пытается создать зомба ie

Примечание: я скомпилировал это на linux с помощью:

gcc   -O1  -ggdb -Wall -Wextra -Wconversion -pedantic   -c "untitled2.c"  -I. 

Примечание: я связал его с:

gcc   -ggdb -Wall -o "untitled2" "untitled2.o"

Однако fork() может не работать, в в этом случае возвращается -1, поэтому код должен иметь

case -1:
    perror( "fork failed" );
    break;

, а теперь предлагаемый код:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>

extern char **environ;

void printenv()
{
  int i = 0;
  while (environ[i] != NULL) {
    printf("%s\n", environ[i]);
    i++;
  }
}

int main( void )
{
  pid_t childPid;

  switch(childPid = fork()) 
  {
    case 0: /* child process */
      printenv();
      exit(0);

    default: /* parent process */
      //printenv();
      waitpid( childPid, NULL, 0);
      exit(0);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...