zxCoder
zxCoder

Reputation: 71

error occur when I call execvp to run java

I use chdir() to switch the directory, and then use execvp() to execute "java Main". I'm sure there is Main.class, but something went wrong. I want to know why.

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

the error is could not find the main class , and I can run java Main in that directory.

What drives me crazy is that I can't use system("java Main"), and the error is that Error: Could not find or load main class Main, and it's just like this on my computer

update:

#include <unistd.h>
#include <cstdlib>
int main(){
    chdir("/home/keane/Judge/temp");
    system("pwd");
    system("ls");
    system("java Main");
    return 0;
}

the output on console is:

/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

my final solution is to reboot the computer and add -cp . to the java command. althought I don't why is necessary. thanks everyone!

Upvotes: 1

Views: 344

Answers (2)

Peter
Peter

Reputation: 3164

This works as intended on my system, maybe you need to add -cp . to your java call.

EDIT: to elaborate: -cp (for classpath) tells java where to look for user provided .class files. This does not necessarily include the current working directory by default.

Upvotes: 2

cdecompilador
cdecompilador

Reputation: 113

The execution of execvp() is non-blocking and takes ownership of the caller, that means that when it starts if the program ends too quickly you will never be able to see the result, to solve this I use fork(). The wait is just to avoid using sleep as I used at the begining. Its all in 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;
}

Upvotes: 0

Related Questions