Есть программа prog1.exe, которая запускает программу prog2.exe (консольное приложение). Программа prog2 написана на C++. Будем считать для простоты, что программа prog1 тоже написана на C++. Тогда программа prog1 вызывает программу prog2, например, следующим образом:
#include "stdafx.h"
#include "windows.h"
void main()
{
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
if (CreateProcess("c:\\windows\\notepad.exe",NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi)==TRUE)
{
// действия;
Sleep(1000); // подождать
TerminateProcess(pi.hProcess,NO_ERROR); // убрать процесс
}
}
(Можно запустить и другими способами--через WinExec или через ShellExecute).
Программы prog1 и prog2 обмениваются данными через текстовые файлы.
Вопрос: как в программе prog2 отследить то, что она прерывается и обработать это прерывание? Как записать данные из программы prog2 в текстовой файл, чтобы запись прошла успешно при прерывании?
В базах данных есть такое понятие, как транзакция. Это когда группа команд объединяется в единое целое. Если все команды в этой группе прошли успешно, то происходит commit (подтверждение), а если хотя-бы одна команда не выполнилась, то происходит rollback (откат).
В моём случае не используются базы данных. Можно ли, тем не менее, несколько команд записи в файл в программе prog2 объединить в одну группу, чтобы либо все эти команды были выполнены, либо ни одна из них не была выполнена?
Здравствуйте, erslgoeirjh, Вы писали:
E>В моём случае не используются базы данных. Можно ли, тем не менее, несколько команд записи в файл в программе prog2 объединить в одну группу, чтобы либо все эти команды были выполнены, либо ни одна из них не была выполнена?
1) Советую не убивать процесс, а передавать ему какой-то сигнал о том, что пока закрываться, например по RPC, или, хотя бы, файл какой специальный куда писать

2) Можно, например, писать очередную версию файлов в папку с уникальным именем, а по завершении переименовывать папку в нужную. Момент переименования и будет комитом.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, erslgoeirjh, Вы писали:
E>E>#include "stdafx.h"
E>#include "windows.h"
E>void main()
E>{
E> STARTUPINFO cif;
E> ZeroMemory(&cif,sizeof(STARTUPINFO));
E> PROCESS_INFORMATION pi;
E> if (CreateProcess("c:\\windows\\notepad.exe",NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi)==TRUE)
E> {
E> // действия;
E> Sleep(1000); // подождать
E> TerminateProcess(pi.hProcess,NO_ERROR); // убрать процесс
E> }
E>}
E>
Извиняюсь, правильно надо написать:
if (CreateProcess("prog2.exe",NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi)==TRUE)