Одни и те же exe файлы лабораторной работы про процессы, написанные на с++ на разных машинах с XP почему-то имеют свойства работать по-разному. На машине создательницы все работает без единой ошибки, на машине ее подруги работает на половину, а у приятелей ее подруги вообще не открываются.

shot21.jpg

Далее задание и код по просьбе minnenzinger .

1. Написать программу SLAVE , которая выводит на экран содержимое текстового файла, имя которого передается ей в параметре. Если параметр не передан, вывести об этом сообщение и закончить программу. Если программа запущена из процесса MASTER, вывести на экран уникальный идентификатор приложения MASTER. Если программа запущена сама по себе вывести об этом информацию.

2. Написать приложение MASTER которое:

а) получает в качестве параметра имя исполняемого файла и запускает данное приложение, указанное в качестве параметра;

б) если параметр не передан, то находит заданный в программе текстовый файл, запускает приложение SLAVE и передает в качестве параметров имя текстового файла и уникальный идентификатор приложения MASTER . При завершении программы SLAVE завершается MASTER

3. Продемонстрировать совместную работу двух приложений. Для этого на экран должна выводиться достаточно подробная информация о ходе выполнения каждого из процессов.

slave.JPG

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: , , ,

This entry was posted on Friday, May 30th, 2008 at 1:50 pm and is filed under IT, Личное. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a reply

Name (*)
Mail (*)
URI
Comment