Мутный вопрос про java и c++
От: nikinikiniki  
Дата: 31.03.18 12:17
Оценка:
Добрый день, уважаемые гуру!

Взываю к вашей помощи, так как ответ сам не могу найти

Имеем :
1. java код (ru.java.process.manager.jar), который умеет запускать через Runtime.getRuntime().exec(); некое *.exe приложение, например
Runtime.getRuntime().exec("c:\\temp\\process_manager.exe");


2. C/C++ код приложения process_manager.exe, который умеет вызывать команды через system (), например
int r_1 = system ("echo 123 > c:\\temp\\123.dat");
int r_2 = system ("c:\\temp\\some_script.cmd");


3. и CMD код some_script.cmd :
echo 456 > c:\\temp\\456.dat


Как работает:
11. Если запустить process_manager.exe руками в консоли, то создаются и 123.dat и 456.dat

Как не работает:
22. Если запустить process_manager.exe через ru.java.process.manager.jar, то создается 123.dat, НО НЕ СОЗДАЕТСЯ 456.dat
22.1 int r_2 = system ("c:\\temp\\some_script.cmd"); возвращает в этом случае код "1".

Вопрос:
33. Как заставить работать вызов system ("c:\\temp\\some_script.cmd") при спауне процесса process_manager.exe из под java машины ?


Примеры кода :

44. ru.java.process.manager.jar.starter.cmd :
java -jar ru.java.process.manager.jar ru.java.process.manager.MainClass


55. ru.java.process.manager.jar
package ru.java.process.manager;

public class MainClass {
    public static void main(String[] args) {
        try {
            //
            Runtime.getRuntime().exec("c:\\temp\\process_manager.exe");
            //
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


66. process_manager.exe
#include <cstdlib>
/**
 *
 */
int main(int argc, char **argv) {
    //это работает и при запуске process_manager.exe руками из консоли
    //и при запуске process_manager.exe через java ru.java.process.manager
    int r_1 = system ("echo 123 > c:\\temp\\123.dat");

    //а вот это работает при запуске process_manager.exe руками из консоли
    //но НЕ работает при запуске process_manager.exe через java ru.java.process.manager
    int r_2 = system ("c:\\temp\\some_script.cmd");
}

77. some_script.cmd
echo 456 > c:\\temp\\456.dat



Заранее благодарен!
java c++ system console
Re: Мутный вопрос про java и c++
От: c-smile Канада http://terrainformatica.com
Дата: 31.03.18 15:49
Оценка:
Здравствуйте, nikinikiniki, Вы писали:

Попробуй так:

system("call c:\\temp\\some_script.cmd");
Re[2]: Мутный вопрос про java и c++
От: nikinikiniki  
Дата: 01.04.18 05:43
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, nikinikiniki, Вы писали:


CS>Попробуй так:


CS>
CS>system("call c:\\temp\\some_script.cmd");
CS>


Не работает — все перепробовал. Странно, что при запуске exe из консоли все работает as expected.
Re: Мутный вопрос про java и c++
От: nikinikiniki  
Дата: 01.04.18 06:25
Оценка:
Провел ещё немного экспериментов :

#include <cstdlib>
#include <fstream>
#include <windows.h>

/**
 *
 */
int main(int argc, char **argv) {
    //
    std::ofstream out ("c:\\temp\\process_manager.log");
    //
    //это работает и при запуске process_manager.exe руками из консоли
    //и при запуске process_manager.exe через java ru.java.process.manager
    int r_1 = system("echo 123 > c:\\temp\\123.dat");
    out << "r_1 : " << r_1 << std::endl;

    //а вот это работает при запуске process_manager.exe руками из консоли
    //но НЕ работает при запуске process_manager.exe через java ru.java.process.manager
    int r_2 = system("call c:\\temp\\some_script.cmd");
    out << "r_2 : " << r_2 << std::endl;

    {
        STARTUPINFO si = { 0 };
        PROCESS_INFORMATION pi = { 0 };
        ::CreateProcess("C:\\Windows\\System32\\cmd.exe",
                "/c c:\\temp\\some_script.cmd", NULL, NULL, true, 0, NULL,
                NULL, &si, &pi);

        out << "0 create process last error : " << ::GetLastError() << std::endl;
        ::WaitForSingleObject( pi.hProcess, INFINITE );
        DWORD exit_code = 0;
        ::GetExitCodeProcess(pi.hProcess, &exit_code);
        out << "0 create process exit_code : " << exit_code << std::endl;
        ::CloseHandle( pi.hProcess );
        ::CloseHandle( pi.hThread );
    }

    {
        STARTUPINFO si = { 0 };
        PROCESS_INFORMATION pi = { 0 };
        ::CreateProcess("C:\\Windows\\System32\\cmd.exe",
                "/c call c:\\temp\\some_script.cmd", NULL, NULL, true, 0, NULL,
                NULL, &si, &pi);

        out << "1 create process last error : " << ::GetLastError() << std::endl;
        ::WaitForSingleObject( pi.hProcess, INFINITE );
        DWORD exit_code = 0;
        ::GetExitCodeProcess(pi.hProcess, &exit_code);
        out << "1 create process exit_code : " << exit_code << std::endl;
        ::CloseHandle( pi.hProcess );
        ::CloseHandle( pi.hThread );
    }

    {
        STARTUPINFO si = { 0 };
        PROCESS_INFORMATION pi = { 0 };
        ::CreateProcess("c:\\temp\\some_script.cmd",
                "", NULL, NULL, true, 0, NULL,
                NULL, &si, &pi);
        out << "2 create process last error : " << ::GetLastError() << std::endl;
        ::WaitForSingleObject( pi.hProcess, INFINITE );
        DWORD exit_code = 0;
        ::GetExitCodeProcess(pi.hProcess, &exit_code);
        out << "1 create process exit_code : " << exit_code << std::endl;
        ::CloseHandle( pi.hProcess );
        ::CloseHandle( pi.hThread );
    }
    //
    out.flush();
    out.close();

}



При запуске exe файла из консоли все ожидаемо работает :
r_1 : 0
r_2 : 0
0 create process last error : 0
0 create process exit_code : 0
1 create process last error : 0
1 create process exit_code : 0
2 create process last error : 0
1 create process exit_code : 0


При запуске exe файла из java ошибки теже (и файл c:\temp\456.dat не создается):

r_1 : 0
r_2 : 1
0 create process last error : 0
0 create process exit_code : 1
1 create process last error : 0
1 create process exit_code : 1
2 create process last error : 0
1 create process exit_code : 1
Re: Мутный вопрос про java и c++
От: kov_serg Россия  
Дата: 01.04.18 14:13
Оценка:
Здравствуйте, nikinikiniki, Вы писали:

N>Добрый день, уважаемые гуру!


N>Взываю к вашей помощи, так как ответ сам не могу найти

А вы пробывали дождаться выполнения команды, прежде чем выходить?

Runtime.getRuntime().exec("c:\\temp\\process_manager.exe").waitFor();
Re[2]: Мутный вопрос про java и c++
От: kov_serg Россия  
Дата: 01.04.18 14:20
Оценка:
Кстати есть еще ProcessBuilder возможно он вам будет удобнее
Re[2]: Мутный вопрос про java и c++
От: nikinikiniki  
Дата: 01.04.18 14:50
Оценка:
Здравствуйте, kov_serg, Вы писали:
_>А вы пробывали дождаться выполнения команды, прежде чем выходить?

_>
_>Runtime.getRuntime().exec("c:\\temp\\process_manager.exe").waitFor();
_>



Пробовал по разному, не хочет ...


package ru.java.process.manager;

public class MainClass {
    public static void main(String[] args) {
        try {
            //
            Runtime.getRuntime().exec("c:\\temp\\process_manager.exe").wait();

            //ProcessBuilder pb = new ProcessBuilder("c:\\temp\\process_manager.exe");
            //pb.start();
            //pb.wait();
            //
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Re: Мутный вопрос про java и c++
От: c-smile Канада http://terrainformatica.com
Дата: 01.04.18 15:00
Оценка: 3 (1)
Здравствуйте, nikinikiniki, Вы писали:

Глянь сюда:
https://stackoverflow.com/questions/21903326/java-runtime-exec-does-not-execute-correctly
Re[2]: Мутный вопрос про java и c++
От: nikinikiniki  
Дата: 01.04.18 15:19
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, nikinikiniki, Вы писали:


CS>Глянь сюда:

CS>https://stackoverflow.com/questions/21903326/java-runtime-exec-does-not-execute-correctly

is "1", therefore java recognizes that I have killed the process.


Судя по коду возврата (1) из system("call my_cool_batch.cmd") java машина возможно считает, что мой my_cool_batch.cmd кильнулся рановато ...
У меня ситуация чуть хитрее, так как я запускаю system("call my_cool_batch.cmd") из dll, которая запускается из процесса "process_manager.exe", который, в свою очередь, запускается из java машины.

Пока что буду смотреть на https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx



Спасибо!
Re[3]: Мутный вопрос про java и c++
От: c-smile Канада http://terrainformatica.com
Дата: 01.04.18 15:47
Оценка:
Здравствуйте, nikinikiniki, Вы писали:

N>Здравствуйте, c-smile, Вы писали:


CS>>Здравствуйте, nikinikiniki, Вы писали:


CS>>Глянь сюда:

CS>>https://stackoverflow.com/questions/21903326/java-runtime-exec-does-not-execute-correctly

N>is "1", therefore java recognizes that I have killed the process.


Там идея в том что нужно вычитывать output перед тем как спрашивать код возврата.
Re[3]: Мутный вопрос про java и c++
От: EreTIk EreTIk's Box
Дата: 02.04.18 11:45
Оценка:
Здравствуйте, nikinikiniki, Вы писали:

N>Не работает — все перепробовал. Странно, что при запуске exe из консоли все работает as expected.


И так тоже не работает:
C:\Windows\System32\cmd.exe /c c:\temp\some_script.cmd

?
Re[4]: Мутный вопрос про java и c++
От: nikinikiniki  
Дата: 02.04.18 12:29
Оценка:
Здравствуйте, EreTIk, Вы писали:

ETI>Здравствуйте, nikinikiniki, Вы писали:


N>>Не работает — все перепробовал. Странно, что при запуске exe из консоли все работает as expected.


ETI>И так тоже не работает:

ETI>
ETI>C:\Windows\System32\cmd.exe /c c:\temp\some_script.cmd
ETI>

ETI>?

Тоже не работает...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.