开发者

how to run same jar file multiple times by forking new child process every time?

i am trying to write a c++ program. the program is required to run some jar files, run every jar file two times. the problem is that the program runs every file just one time correctly. at the second time i got an error message, as if the VM got a wrong command. However, it is the same command that run the jar files the first time !!!

This is the first few lines of the red-colored error message that i got.

Usage: java [-options] class [args...]
       (to execute a class)
   or  java [-options] -jar jarfile [args...]
       (to execute a jar file)
where options include:
    -d32      use a 32-bit data model if available
    -d64      use a 64-bit data model if available
    -client   to select the "client" VM
    -server   to select the "server" VM

This is my code. This is the main file:

#include <iostream>
#include <fstream>
#include <signal.h>
#include <string.h>
#include <time.h>
#include "StringParser.h"
#include "ShellCore.h"
using namespace std;

int main() {

    while (1) {

    char checkers_command[] = "java -jar /home/samer/Downloads/chkr.jar";
    char castle_command[] = "java -jar /home/samer/Downloads/cas.jar";

        int child_status;
        bool wait_bool = true;
        cout << "Run Batch Shell> ";
        cin.getline(input_command_line, 256);

        if (strcasecmp("exit", input_command_line) == 0) {
            cout << "The shell program will terminate\n";
            exit(0);
        } else {
            char* commands;
            for (int var = 0; var < 4; ++var) {
                if (var % 2 == 0) {
                    commands = checkers_command;
                } else if (var % 2开发者_如何转开发 == 1) {
                    commands = castle_command;
                } 

                char* arg_list_tokened[50];
                parse_command_line(arg_list_tokened, commands);
                spawn(arg_list_tokened[0], arg_list_tokened);

            if (wait_bool) {
                // The parent wait until the child finishes.
                cout << "The parent will wait for " << arg_list_tokened[0] << endl;
                wait(&child_status);
                if (WIFEXITED(child_status)) {
                    printf("The child process exited normally with exit code %d\n",
                            WEXITSTATUS(child_status));
                } else {
                    printf("The child process exited abnormally\n");
                }
            }
        }
        cout << "done\n";
    }
}
return 0;
}

This is the "spawn" method in the Shellcore.cpp file: The Shellcore.h contains the required includes for the Shellcore.cpp.

#include "ShellCore.h"

pid_t child_pid;

int spawn(char* program_name, char** args) {
    child_pid = fork();

        if (child_pid != 0) {
        return child_pid;
    } else {
        execvp(program_name, args);
        // If the execvp return, this indicate that an error occurred.
        printf("From the spawn function in the parent process, execvp ERROR\n");
        abort();
    }
}

sorry for the long question and long code. Thanks is advance :)

The parse function:

void parse_command_line(char* output_list[], char* command_line) {
    char * pch;
    int i = 0;
    pch = strtok(command_line, " &\"");
    output_list[0] = pch;
    while (pch != NULL) {
        i++;
        pch = strtok(NULL, " &\"");
        output_list[i] = pch;
    }
    output_list[++i] = NULL;
}


strtok() changes your string when you call it. You set the pointer "commands" to either checkers_command or castle_command but strtok is just going to overwrite the memory pointed to at each of the latter. If you copy checkers/castle rather than just point to it before calling your parse function you will have a fresh copy of checkers/castle each time through the loop.

There are much better ways to do this than strdup but for brevity sake you can simply do this. If you keep this method of copying the string (unadvisable) remember to call free() on the returned pointer when you are done with it or you will have a memory leak.

Change to something like this:

for (int var = 0; var < 4; ++var)
{
    if (var % 2 == 0)
    {
        //commands = checkers_command;
        commands = strdup(checkers_command);
    }
    else
        if (var % 2 == 1)
        {
            //commands = castle_command;
            commands = strdup(castle_command);
        }

   char* arg_list_tokened[50];

   parse_command_line(arg_list_tokened, commands);

   spawn(arg_list_tokened[0], arg_list_tokened);

   //............

}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜