我正在尝试编写一个C ++程序。 该程序需要运行一些jar文件,每运行一次jar文件两次。 问题是程序正确运行每个文件一次。 在第二次我得到一个错误消息,就像虚拟机得到了一个错误的命令。 但是,这是第一次运行jar文件的命令!
这是我得到的红色错误消息的前几行。
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
这是我的代码。 这是主要文件:
#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; }
这是Shellcore.cpp文件中的“spawn”方法:Shellcore.h包含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(); } }
很抱歉,长问题和长码。 感谢提前:)
parsing函数:
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()会改变你的字符串。 您将指针“命令”设置为checkers_command或castle_command,但strtok只是要覆盖指向每个后者的内存。 如果你复制棋子/城堡而不是在调用你的解析函数之前指向它,那么每次在循环中都会有一个新的棋子/城堡副本。
比strdup有更好的方法来做这个,但是为了简洁起见,你可以简单地做到这一点。 如果保留这种复制字符串(不可取)的方法,请记住在完成对返回的指针时调用free(),否则将发生内存泄漏。
改成这样的东西:
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); //............ }