Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用execvp运行java时出错_C++_Linux_System_Execvp - Fatal编程技术网

C++ 调用execvp运行java时出错

C++ 调用execvp运行java时出错,c++,linux,system,execvp,C++,Linux,System,Execvp,我使用chdir()切换目录,然后使用execvp()执行“javamain”。我肯定有主课,但出了点问题。我想知道为什么 #include <cstdio> #include <unistd.h> using namespace std; int main(){ char buf[80]; getcwd(buf,sizeof(buf)); printf("current working directory: %s\n", bu

我使用
chdir()
切换目录,然后使用
execvp()
执行“javamain”。我肯定有主课,但出了点问题。我想知道为什么

#include <cstdio>
#include <unistd.h>
using namespace std;
int main(){
    char buf[80];
    getcwd(buf,sizeof(buf));
    printf("current working directory: %s\n", buf);
    chdir("/home/keane/Judge/temp");
    getcwd(buf,sizeof(buf));
    printf("current working directory: %s\n", buf);
    char *array[3];
    array[0] = "java";
    array[1] = "Main";
    array[2] = NULL;
    execvp("java", array);
    return 0;
}
控制台上的输出为:

/home/keane/Judge/temp
1.out  3.out  5.out   Main.class  stdout_spj.txt
2.out  4.out  ce.txt  Main.java
Error: Could not find or load the main class Main
我的最终解决方案是重新启动计算机,并将
-cp.
添加到java命令中。 虽然我不知道为什么有必要。
谢谢大家

我认为您无法运行.class文件。你应该去找那个罐子。这基本上就是“java可执行文件”。它通常应该在编译java项目时出现。

这在我的系统上正常工作,可能需要将
-cp.
添加到java调用中

编辑:详细说明:
-cp
(对于类路径)告诉java在哪里查找用户提供的
.class
文件。默认情况下,这不一定包括当前工作目录。

执行execvp()是非阻塞的,并且拥有调用者的所有权,这意味着当它启动时,如果程序结束得太快,您将永远看不到结果,要解决这个问题,我使用fork()。等待只是为了避免像我刚开始时那样使用睡眠。全部用c

#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
char-buf[80];
getcwd(buf,sizeof(buf));
printf(“当前工作目录:%s\n”,buf);
chdir(“/home/”);
getcwd(buf,sizeof(buf));
printf(“当前工作目录:%s\n”,buf);
char*array[3]={“java”,“Main”,NULL};
如果(fork()==0){
if(execvp(“java”,数组)<0){
fprintf(stderr,“生成错误命令:%s\n”,strerror(errno));
}
}否则{
printf(“生成命令\n”);
等待(NULL);//等待分叉进程结束(避免使用睡眠)
}
返回0;
}

java
难道不应该得到一个
.jar
文件,其中也包含
Main
类吗?我不是Java专家,所以如果我不太清楚,请忽略我的无知。但是请把错误信息也放在你的问题上,否则很难诊断每个人都发生了什么。@πάνταῥεῖ 否,
java Main
将运行
Main.class
Main
方法,该方法包含完全限定的类名
Main
@AnttiHaapala,.jar或默认情况下取自的任何内容在哪里?@πάνταῥεῖ 没有“默认罐子”。。。不管那意味着什么
Main.class
必须是该目录中的文件<代码>javac Main.java;java Main
您也可以尝试添加Peter建议的
-cp.
,尽管类似的方法对我来说一直都很有效,但我可以在目录中运行“java Main”。是的,他可以直接使用java命令运行类文件,您可以将jar文件视为“快捷方式”对于这条命令,你的答案指向了一些真理的要素,但在技术上是不正确的。可以仅使用
.class
文件(单个或多个文件)执行java程序。
.jar
是将多个
.class
文件打包到一个归档文件中的一种简便方法,它使下载/移动文件变得更容易。如果将程序中的所有必要文件打包在一个“java代码> .jar”/>代码中,以及适当的配置,以指向要用作主类的类,则是的,可以将其视为“Java可执行文件”,但可以没有此主类说明符的jar。也许有时它可以工作,但不应该,因为函数
execvp
是如何工作的。@cdecompilador:你的答案毫无意义,为什么仅仅因为当前进程被
java
替换,输出就不可见?据我所知,函数
execvp
就是这样工作的,它遮蔽了整个过程,但它不是-blocking@cdecompilador:不是这样,它完全替换了当前进程。如果execvp成功,则execvp调用之后的任何代码都不会执行。我很困惑。我完全复制了您的代码,只修改了Main.class的目录。但错误仍然存在。我不知道这是否是我的java环境问题,但我可以在这个路径中运行“JavaMain”,它显示了某种错误?如果命令失败,它将显示类似于
错误生成命令:
。这适用于我的系统否,只是显示“错误:找不到主类”。我更改了chdir()函数,因为为了使它在我的系统上工作,我知道,我将参数更改为main.class的路径
/home/keane/Judge/temp
1.out  3.out  5.out   Main.class  stdout_spj.txt
2.out  4.out  ce.txt  Main.java
Error: Could not find or load the main class Main