一开始,我想用jni实现这一功能,我的代码如下:
int status = 0, retval= 0;
pid_t child;
child = fork();
if(child == -1){
return -1;
}else if(child == 0){
retval = execve(cmdpath, argv, NULL);
exit(retval);
}else{
waitpid(child, &status, 0);
printf("In father status = %.8x\n", status);
} 不过发现status的值始终是0,相同的代码再C中调用是成功的,返回status > 0的值.本人还是新手,望高手指点! 还有问题真的有点急, 万分感谢!
int status = 0, retval= 0;
pid_t child;
child = fork();
if(child == -1){
return -1;
}else if(child == 0){
retval = execve(cmdpath, argv, NULL);
exit(retval);
}else{
waitpid(child, &status, 0);
printf("In father status = %.8x\n", status);
} 不过发现status的值始终是0,相同的代码再C中调用是成功的,返回status > 0的值.本人还是新手,望高手指点! 还有问题真的有点急, 万分感谢!
解决方案 »
- 关于把字符串格式化成日期的问题
- 我想问问委托与代理,其本质区别到底是什么
- 新手求教打印日历项的问题
- 一段简单的代码,想着实现改变窗体背景颜色的效果,可是运行后却没有效果,怎么回事啊?
- 多个类中的方法构成事务,怎么解决
- 这道题如何做?
- JAVA下包编译的问题,我在 D:\sample 目录下 有几个JAVA文件要编译,其中一个需要调用另外一个CLASS。但是总是提示这些错误。。。。
- 哪里有java做的应用程序的源代码下
- 请问在JPanel上怎样定位鼠标的位置?
- Exception in thread "main" java.lang.Error: 无法解析的编译问题
- 关于RMI调用的问题
- 请教eclipse 怎么用?
pid_t child;
child = fork();
if(child == -1){
return -1;
}else if(child == 0){
printf("This is child\n");
printf("child is pid = %d\n",getpid());
exit(7);
}else{
while( ( (child=wait(&status)) == -1 )&(errno==EINTR));
if(child == -1) {
printf("Wait Error:%s\n",strerror(errno));
}else if(!status){
printf("Child %ld terminated normally return status is zero\n", child);
}else if(WIFEXITED(status)) {
printf("Child %ld terminated normally return status is %d\n", child,WEXITSTATUS(status));
}else if(WIFSIGNALED(status)){
printf("Child %ld terminated due to signal %d znot caught\n", child,WTERMSIG(status));
}
}
在C下面输出的结果:This is child
child is pid = 11055
Child 11055 terminated normally return status is 7
jni调用的结果:
****TestAction
This is child
child is pid = 11152
Wait Error:No child processes
我想强调的是一个问题,命令已经执行了并且打印了信息,不过父进程中未能得到子进程退出时的值.
还有的是如果直接用java的Runtime.exe()调用的话是没问题的,可以得到命令的返回值,代码如下:public class Command{
public static int exec(String args[]){
try{
Process process = Runtime.getRuntime().exec(args);
int retval = process.waitFor();
print("***exec retval = " + retval);
process.destroy();
return retval;
}catch(Exception e){
System.out.println(e);
return -1;
}
}
}其中必有猫腻!
我调用是成功的 网上有很多关于着放慢的介绍 自己找印象比较深
java有runtime可以直接调用命令的
Process process = Runtime.getRuntime().exec("dir");
process.getInputStream();
process.getOutputStream();可以通过process获得输入输出,这样可以直接拿到结果
必须是标准的jni输入输出,在c中必需把指针值转换成基本数据类型才能实现c与java之间信息传递。
Wait Error:No child processes!是在C里面的wait()函数打印出来的错误,此时还没有和JAVA通讯!
这只是在windows下吧.
以前看过一文章叫做 JNI完全手册 你google一下.希望对你有帮助