我遇到了在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,所以我不知道为什么一个调用是坏的。
答案 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.内置系统变量
在HKEY_LOCAL_MACHINE配置单元中找到的系统变量
在HKEY_CURRENT_USER配置单元中找到的局部变量
Autoexec.bat文件中设置的所有环境变量和路径
登录脚本中设置的所有环境变量和路径(如果存在)
在脚本或批处理文件中以交互方式使用的变量
这方面的真正含义是...... http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true
答案 3 :(得分:0)
最后解决了,问题原来是在后台运行的反病毒服务,它以某种方式干扰了事情。
感谢大家的帮助。