системный вызов возвращает «Отказано в доступе» в Windows XP - PullRequest
0 голосов
/ 16 апреля 2010

У меня проблема с программой на C, работающей в Windows XP, которая выдает ошибки Permission Denied (EACCES) при попытке вызвать system ().

Кажется, не имеет значения, что я положил в командную строку, все команды работают вручную, но получают ошибки «Отказано в доступе» при выполнении через system ()

Другая интересная вещь заключается в том, что программа корректно работает на других компьютерах с XP, но не на этой. Это создает ощущение какой-то настройки ОС, но я не совсем уверен, что system () делает под капотом, и хотел бы понять, что здесь происходит.

Вот мой тестовый код:

fprintf( stderr, "DEBUG: Running test of system(NULL) call...\n" );
if ( ( ret = system( NULL ) ) != 0)
    fprintf( stderr, "  DEBUG: ret: %d: errno: %d, %s\n", ret, errno, strerror( errno ) );

fprintf( stderr, "DEBUG: Running test of system(\"sleep 1\") call...\n" );
if ( ( ret = system( "sleep 1" ) ) != 0 )
    fprintf( stderr, "  DEBUG: ret: %d: errno: %d, %s\n", ret, errno, strerror( errno ) );

Это выдает

DEBUG: Running test of system(NULL) call...
  DEBUG: ret: 1: errno: 0, No error
DEBUG: Running Test of system("sleep 1") call...
  DEBUG: ret: -1: errno: 13, Permission denied

Спасибо.

ОБНОВЛЕНИЕ: Я также изменил свой код, чтобы использовать CreateProcess () вместо system (), и я все еще получаю ошибку «Отказано в доступе» (5). Это делает его еще более похожим на настройку ОС, но я не знаю, где искать.

ОБНОВЛЕНИЕ2: Монитор процессов показывает ошибку при вызове «QueryOpen» для пути «D: \ cmd.exe», который не существует. Все остальные вызовы для C: \ WINDOWS \ system32 \ cmd.exe, поэтому я не знаю, почему один вызов плохой.

Ответы [ 4 ]

0 голосов
/ 19 апреля 2010

В конце концов, проблема оказалась в антивирусной службе, работающей в фоновом режиме, которая как-то мешала вещам.

Спасибо всем за помощь.

0 голосов
/ 16 апреля 2010

Вы уверены, что правильно проверяете неисправность? MSDN не перечисляет EACCES как возможный сбой. EACCES может просто ошибаться из предыдущего кода.

int how_to_test_system(char const* command) {
  int rc;
  switch ((rc = system(command))) {
  case -1: // an error happened in calling system() itself
    perror("system"); // prints "system: <msg>"
    break;

  case 0: // command completed successfully
    break;

  default: // command executed, but had a non-zero return code
    // you might want to log something here
    // (otherwise you can simplify this switch into a single if for -1)
    break;
  }
  return rc;
}
0 голосов
/ 17 апреля 2010

Переменная окружения COMSPEC установлена ​​неправильно или переопределяется

Ищите COMSPEC в 1. Встроенные системные переменные

  1. Системные переменные, найденные в кусте HKEY_LOCAL_MACHINE

  2. Локальные переменные, найденные в кусте HKEY_CURRENT_USER

  3. Все переменные среды и пути, заданные в файле Autoexec.bat

  4. Все переменные среды и пути, установленные в сценарии входа в систему (если есть)

  5. Переменные, используемые в интерактивном режиме в скрипте или пакетном файле

Настоящая суть того, как это работает, здесь ... http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true

0 голосов
/ 16 апреля 2010

Вы пытались запустить вашу программу с Process Monitor ? Process Monitor покажет вам все системные вызовы, которые делает ваша программа, а также множество других метаданных о вызовах (например, их аргументы и возвращаемые значения). Это может помочь вам отладить причину ошибки «Отказано в доступе».

...