我正在为大学做练习,我必须在退出时返回一个值,这个值实际上是一些东西.这可能高于255(exit()无法处理)但是老师建议使用测试数据,其中计数永远不会高于该值.
毕竟,我需要处理这个计数值,退出状态,我通过使用waitpid()在主进程中得到了这个值.令我惊讶的是,如果子进程返回1,则主进程中的"实际"值为256,2为512,依此类推......
我需要打印这个值,所以我简单地将它除以256并完成了.但是,如果我使用WEXITSTATUS()宏,我也会按照我想要的方式得到这个值...
我查看了C源代码,这是我发现的:
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
Run Code Online (Sandbox Code Playgroud)
我理解这里发生了什么,例如,二进制512是10 0000 0000,右移8'将得到00 0000 0010,即十进制2.在这个宏中我不明白的是&运算符和0xff00似乎是一个随机数的事实(它可能不是,它来自哪里?).这究竟是做什么的,为什么宏中有"&0xff00"?它不会有效吗?
在这个主题中真正的问题是,在我的代码中将此宏称为除以256是一回事吗?
我正在尝试从 C 代码运行位于我的网络服务器上的 java 文件。当我加载网页时,perl 脚本调用 ac 文件,然后调用 java 文件。
我像在我的 c 文件中一样设置了调用:
System(java -cp <path> MyClass);
Run Code Online (Sandbox Code Playgroud)
但是这个 System() 调用返回 256 - (我认为文件未找到)。
我也尝试过:
System(cd /<path> && java MyClass);
Run Code Online (Sandbox Code Playgroud)
并得到相同的结果。
如果我通过 ssh 从终端运行完全相同的命令,它工作正常,只是当我尝试从浏览器运行代码时,它会出现此错误。
如果我的语法不正确,有什么想法吗?或者我做错了什么?它与我被迫使用的 perl > c > java 链有什么关系吗?
编辑看来 c 运行时没有查看 $PATH。我添加了java.exe的绝对路径,并且成功了!呜呜
总览
解决方案:
System("/opt/jdk1.6.0_43/bin/java -cp <path> MyClass");
Run Code Online (Sandbox Code Playgroud) 我想要 system() 在我的应用程序中打印 pstack 信息,但它失败并返回 256。但是我将如下代码拾取到一个新的主函数中,没关系。为什么?
char cmd[256] ;
string pstackCmd;
struct timeval tv;
struct tm lt;(&tv, NULL);
localtime_r(&tv.tv_sec, <);
sprintf(cmd, "pstack `pgrep app` > pstack_%04d%02d%02d%02d%02d%02d%03d",
lt.tm_year+1900,
lt.tm_mon+1,
lt.tm_mday,
lt.tm_hour,
lt.tm_min,
lt.tm_sec,
(int)(tv.tv_usec/1000));
pstackCmd = string(cmd);
int retValue = system(pstackCmd.c_str());
if ( retValue != 0)
{
printf("pstack `pgrep app`,retValue:%d",retValue);
}
Run Code Online (Sandbox Code Playgroud)