system()调用在Windows XP上返回“Permission Denied”

时间:2010-04-15 22:09:05

标签: c windows windows-xp

我遇到了在Windows XP上运行的C程序出现问题,该程序在尝试调用system()时收到Permission Denied(EACCES)错误。

我在命令字符串中输入的内容似乎并不重要,这些命令都可以手动工作,但在通过system()执行时会获得Permission Denied错误

另一个有趣的事情是程序在其他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)。这使它听起来更像是操作系统设置,但我不知道在哪里看。

UPDATE2:进程监视器显示对“D:\ cmd.exe”路径的“QueryOpen”调用失败,该路径不存在。所有其他调用都是针对C:\ WINDOWS \ system32 \ cmd.exe,所以我不知道为什么一个调用是坏的。

4 个答案:

答案 0 :(得分:0)

您是否尝试使用Process Monitor运行程序? Process Monitor将显示程序所做的所有系统调用,以及有关调用的许多其他元数据(例如它们的参数及其返回值)。它可以帮助您调试为什么您收到“Permission Denied”错误。

答案 1 :(得分:0)

您确定要正确检查故障吗? MSDN doesn't list 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;
}

答案 2 :(得分:0)

COMSPEC环境变量设置不正确或被覆盖

寻找COMSPEC 1.内置系统变量

  1. 在HKEY_LOCAL_MACHINE配置单元中找到的系统变量

  2. 在HKEY_CURRENT_USER配置单元中找到的局部变量

  3. Autoexec.bat文件中设置的所有环境变量和路径

  4. 登录脚本中设置的所有环境变量和路径(如果存在)

  5. 在脚本或批处理文件中以交互方式使用的变量

  6. 这方面的真正含义是...... http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true

答案 3 :(得分:0)

最后解决了,问题原来是在后台运行的反病毒服务,它以某种方式干扰了事情。

感谢大家的帮助。