Коварство и колдовство процессов и с++
2008
Одни и те же exe файлы лабораторной работы про процессы, написанные на с++ на разных машинах с XP почему-то имеют свойства работать по-разному. На машине создательницы все работает без единой ошибки, на машине ее подруги работает на половину, а у приятелей ее подруги вообще не открываются.
Далее задание и код по просьбе minnenzinger .
1. Написать программу SLAVE , которая выводит на экран содержимое текстового файла, имя которого передается ей в параметре. Если параметр не передан, вывести об этом сообщение и закончить программу. Если программа запущена из процесса MASTER, вывести на экран уникальный идентификатор приложения MASTER. Если программа запущена сама по себе вывести об этом информацию.
2. Написать приложение MASTER которое:
а) получает в качестве параметра имя исполняемого файла и запускает данное приложение, указанное в качестве параметра;
б) если параметр не передан, то находит заданный в программе текстовый файл, запускает приложение SLAVE и передает в качестве параметров имя текстового файла и уникальный идентификатор приложения MASTER . При завершении программы SLAVE завершается MASTER
3. Продемонстрировать совместную работу двух приложений. Для этого на экран должна выводиться достаточно подробная информация о ходе выполнения каждого из процессов.
master2.cpp:
#include "windows.h"
#include <iostream>
#include <string.h>
using namespace std;
void main(int argc, char *argv[])
{
DWORD dwExitCode;
DWORD curPId = GetCurrentProcessId();
cout << "Master process PID " << curPId << "\n";
char argPId[6] = " ";
char buffer[20];
char *p;
p=itoa(curPId,buffer,10);
strcat(argPId,buffer);
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
if (argc > 1)
if (CreateProcess(NULL, argv[1] , NULL,NULL,FALSE,CREATE_NEW_CONSOLE ,NULL,NULL,&cif,&pi)==TRUE)
{
cout << "Slave process id is " << pi.dwProcessId << endl;
cout << "Slave process handle is " << pi.hProcess << endl;
cout << "Slave process running\n";
if (WaitForSingleObject(pi.hProcess,INFINITE)!=WAIT_FAILED)
{
GetExitCodeProcess(pi.hProcess,&dwExitCode);
cout << "Child process exit code = " << dwExitCode <<endl;
}
CloseHandle(pi.hProcess);
}
else
cout << "Master with parameter failed.";
else
{
cout << "Enter name of the file you want to read: ";
char fileName[255];
TCHAR directory[255];
DWORD dirLength = GetCurrentDirectory(255,directory);
char space[2]=" ";
TCHAR slave[22] = "\\sys_pro2-lab4.exe";
strcat(directory, slave);
strcat(directory,space);
cin >> fileName;
strcat(directory, fileName);
strcat(directory, argPId);
cout << "\nLoading process " << directory << "\n";
if (CreateProcess(NULL, directory , NULL,NULL,TRUE,CREATE_NEW_CONSOLE ,NULL,NULL,&cif,&pi)==TRUE)
{
cout << "Slave process id is " << pi.dwProcessId << endl;
cout << "Slave process handle is " << pi.hProcess << endl;
cout << "Slave process running\n";
if (WaitForSingleObject(pi.hProcess,INFINITE)!=WAIT_FAILED)
{
GetExitCodeProcess(pi.hProcess,&dwExitCode);
cout << "Child process exit code is " << dwExitCode<<endl;
}
CloseHandle(pi.hProcess);
}
}
// int j ;
//cin >> j;
}
slave.cpp:
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
void main( int argc, char *argv[])
{
DWORD curPId = GetCurrentProcessId();
cout << "This process PID is " << curPId << "\n";
if (argc == 1)
{
cout << "No parameters were given.";
}
else
{
//SetCurrentDirectory("E:\\deadstar\`s folder\\Visual Studio 2005\\Projects\\sys_pro2-lab4\\debug\\");
HANDLE hFile = CreateFile(argv[1],GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD fs = GetFileSize(hFile, NULL);
cout << "\nReading file " << argv[1] << ":\n\n";
if (fs != 0xFFFFFFFF)
{
DWORD nb=0;
char simvol;
for (int i=0; i<fs;i++)
{
ReadFile(hFile,&simvol,1,&nb,NULL);
cout << simvol;
}
cout <<"\n\n The end of file.\n";
}
else
cout << "\nError in trying to obtain file size";
CloseHandle(hFile);
}
else
cout << "\nCoudn`t open givven file";
}
if (argc==3)
cout << "\nThis is slave process, it's parent process PID is " << argv[2] << ".\n";
else
cout << "\nThis process has no parents!\n";
int j;
cin >> j;
}
Tags: иститут, программирование, с++, тси

