当我调用 execvp 到 运行 java 时发生错误

error occur when I call execvp to run java

我用chdir()切换目录,然后用execvp()执行“javaMain”。我确定有 Main.class,但出了点问题。我想知道为什么。

#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;
}

错误是 could not find the main class ,我可以 运行 java Main 在那个目录中。

气死我的是我不能用system("java Main"),错误是Error: Could not find or load main class Main,我电脑上就是这样

更新:

#include <unistd.h>
#include <cstdlib>
int main(){
    chdir("/home/keane/Judge/temp");
    system("pwd");
    system("ls");
    system("java Main");
    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

我最后的解决办法是重启电脑,然后在java命令中加入-cp .。 虽然我不知道为什么是必要的。 谢谢大家!

我认为您不能 运行 .class 文件。你应该寻找.jar。那基本上就是'java-executable'。它通常应该在您编译 java 项目时出现。

这在我的系统上按预期工作,也许您需要将 -cp . 添加到 java 调用中。

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

execvp() 的执行是 non-blocking 并取得调用者的所有权,这意味着当它开始时如果程序结束得太快,你将永远看不到结果,为了解决这个问题,我使用 fork()。等待只是为了避免像我一开始那样使用睡眠。全部在 c.

#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char** argv){
    char buf[80];
    getcwd(buf,sizeof(buf));
    printf("current working directory: %s\n", buf);
    chdir("/home/");
    getcwd(buf,sizeof(buf));
    printf("current working directory: %s\n", buf);
    char *array[3] = {"java", "Main", NULL};
    if(fork() == 0) {
        if(execvp("java", array) < 0) {
            fprintf(stderr, "Error spawning command: %s\n", strerror(errno));
        }
    } else {
        printf("Command spawned\n");
        wait(NULL); // Wait to the forked process to end (avoid using sleep)
    }
    return 0;
}