Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zadachi_OOP_SPIOS_Assembler.doc
Скачиваний:
2
Добавлен:
28.10.2018
Размер:
314.37 Кб
Скачать

6 Программа, демонстрирующая синхронизацию доступа к глобальному массиву с пом. Мютексов

#include "windows.h"

#include "process.h"

#include "stdio.h"

HANDLE hMutex;

int a[5];

void WorkThread(void * pParam)

{

int i,num;

num=0;

while(true)

{

WaitForSingleObject(hMutex,INFINITE);

for(i=0;i<5;i++)

a[i]=num;

ReleaseMutex(hMutex);

num++;

}

}

void main()

{

hMutex=CreateMutex(NULL,FALSE,NULL);

_beginthread(WorkThread,0,NULL);

while(true)

{

WaitForSingleObject(hMutex,INFINITE);

printf("%d %d %d %d %d\n",a[0],a[1],a[2],a[3],a[4],a[5]);

ReleaseMutex(hMutex);

}

}

7 Написать фрагмент программы, которая показывает синхронизацию процессов с помощью семофоров

/* Программа 08-1a.c для иллюстрации работы с

семафорами */

/* Эта программа получает доступ к одному системному семафору,

ждет, пока его значение не станет больше или равным 1

после запусков программы 08-1b.c,а затем уменьшает его на 1*/

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <stdio.h>

int main()

int semid; /* IPC дескриптор для массива IPC

семафоров */

char pathname[] = "08-1a.c"; /* Имя файла,

использующееся для генерации ключа. Файл с таким

именем должен существовать в текущей директории */

key_t key; /* IPC ключ */

struct sembuf mybuf; /* Структура для задания

операции над семафором */

/* Генерируем IPC-ключ из имени файла 08-1a.c в текущей

директории и номера экземпляра массива семафоров 0 */

if((key = ftok(pathname,0)) < 0){

printf("Can′t generate key

");

exit(-1);

}

/* Пытаемся получить доступ по ключу к массиву

семафоров, если он существует, или создать его из одного

семафора, если его еще не существует, с правами доступа

read & write для всех пользователей */

if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){

printf("Can′t get semid

");

exit(-1);

}

/* Выполним операцию D(semid1,1) для нашего массива

семафоров. Для этого сначала заполним нашу структуру.

Флаг, как обычно, полагаем равным 0. Наш массив семафоров

состоит из одного семафора с номером 0. Код операции -1.*/

mybuf.sem_op = -1;

mybuf.sem_flg = 0;

mybuf.sem_num = 0;

if(semop(semid, &mybuf, 1) < 0){

printf("Can′t wait for condition

");

exit(-1);

}

printf("Condition is present

");

return 0;

}

/* Программа 08-1b.c для иллюстрации работы с

семафорами */

/* Эта программа получает доступ к одному системному семафору

и увеличивает его на 1*/

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <stdio.h>

int main()

{

int semid; /* IPC дескриптор для массива IPC

семафоров */

char pathname[] = "08-1a.c"; /* Имя файла,

использующееся для генерации ключа. Файл с таким

именем должен существовать в текущей директории */

key_t key; /* IPC ключ */

struct sembuf mybuf; /* Структура для задания операции

над семафором */

/* Генерируем IPC ключ из имени файла 08-1a.c в текущей

директории и номера экземпляра массива семафоров 0 */

if((key = ftok(pathname,0)) < 0){

printf("Can′t generate key

");

exit(-1);

}

/* Пытаемся получить доступ по ключу к массиву

семафоров, если он существует, или создать его из

одного семафора, если его еще не существует, с правами доступа

read & write для всех пользователей */

if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){

printf("Can′t get semid

");

exit(-1);

}

/* Выполним операцию A(semid1,1) для нашего массива

семафоров. Для этого сначала заполним нашу структуру.

Флаг, как обычно, полагаем равным 0. Наш массив

семафоров состоит из одного семафора с номером 0.

Код операции 1.*/

mybuf.sem_op = 1;

mybuf.sem_flg = 0;

mybuf.sem_num = 0;

if(semop(semid, &mybuf, 1) < 0){

printf("Can′t wait for condition

");

exit(-1);

}

printf("Condition is set

");

return 0;

}

8 чтение содержимого раздела реестра

#include <windows.h>

#include <iostream.h>

#include <iomanip.h>

#include <string.h>

#define STR_HKEY_LOCAL_MACHINE "HKEY_LOCAL_MACHINE"

#define STR_HKEY_CLASSES_ROOT "HKEY_CLASSES_ROOT"

#define STR_HKEY_USERS "HKEY_USERS"

#define STR_HKEY_CURRENT_USER "HKEY_CURRENT_USER"

#define LEN_HKEY_LOCAL_MACHINE (sizeof(STR_HKEY_LOCAL_MACHINE)-1)

#define LEN_HKEY_CLASSES_ROOT (sizeof(STR_HKEY_CLASSES_ROOT)-1)

#define LEN_HKEY_USERS (sizeof(STR_HKEY_USERS)-1)

#define LEN_HKEY_CURRENT_USER (sizeof(STR_HKEY_CURRENT_USER)-1)

#define SWAP_ENDIAN(x) (((x<<24)&0xFF000000)|((x<<8)&0xFF0000)|\

((x>>8)&0xFF00)|((x>>24)|0xFF))

void printval(unsigned char *pBuffer, DWORD dwType, DWORD dwSize) {

switch (dwType)

{

case REG_BINARY:

cout << "Binary data:"; {

for (unsigned int i = 0; i < dwSize; i++) {

if (i % 16 == 0) cout << '\n';

cout.fill('0');

cout << hex << setw(2) <<

(unsigned int)(pBuffer[i]) << ' ';

} }

cout << '\n';

break;

case REG_DWORD:

cout.fill('0');

cout << "Double word: " << hex << setw(8) << *((unsigned int *)pBuffer) << '\n';

break;

case REG_DWORD_BIG_ENDIAN: // Intel specific!

cout.fill('0');

cout << "Big-endian double word: " << hex << setw(8) <<

SWAP_ENDIAN(*((unsigned int *)pBuffer)) << '\n';

break;

case REG_EXPAND_SZ:

cout << "Expandable string: " << pBuffer << '\n';

break;

case REG_LINK:

cout << "Unicode link.";

break;

case REG_MULTI_SZ:

cout << "Multiple strings:\n"; {

char *pStr;

int i;

for (i = 0, pStr = (char *)pBuffer; *pStr != '\0'; i++, pStr += strlen((char *)pStr) + 1) {

cout << "String " << i << ": " << pStr << '\n';

} }

break;

case REG_NONE:

cout << "Undefined value type.\n";

break;

case REG_RESOURCE_LIST:

cout << "Resource list.\n";

break;

case REG_SZ:

cout << "String: " << pBuffer << '\n';

break;

default:

cout << "Invalid type code.\n";

break;

} }

void main(void) {

char szKey[1000];

char *pKey;

HKEY hKey, hSubKey;

DWORD dwType;

DWORD dwSize;

unsigned char *pBuffer;

int nKey;

while (1) {

cout << "Enter key: ";

cin.getline(szKey, 1000);

nKey = strcspn(szKey, "\\");

hKey = NULL;

if (!strncmp(szKey, STR_HKEY_LOCAL_MACHINE, nKey) &&

nKey == LEN_HKEY_LOCAL_MACHINE)

hKey = HKEY_LOCAL_MACHINE;

if (!strncmp(szKey, STR_HKEY_CLASSES_ROOT, nKey) &&

nKey == LEN_HKEY_CLASSES_ROOT)

hKey = HKEY_CLASSES_ROOT;

if (!strncmp(szKey, STR_HKEY_USERS, nKey) &&

nKey == LEN_HKEY_USERS)

hKey = HKEY_USERS;

if (!strncmp(szKey, STR_HKEY_CURRENT_USER, nKey) &&

nKey == LEN_HKEY_CURRENT_USER)

hKey = HKEY_CURRENT_USER;

if (hKey == NULL || szKey[nKey] != '\\') {

cout << "Invalid key.\n";

continue;

}

pKey = szKey + nKey + 1;

nKey = strcspn(pKey, "\\");

while (pKey[nKey] == '\\')

{

pKey[nKey] = '\0';

if (RegOpenKeyEx(hKey, pKey, NULL, KEY_READ,&hSubKey) == ERROR_SUCCESS) {

RegCloseKey(hKey);

hKey = hSubKey;

}

else {

RegCloseKey(hKey);

hKey = NULL;

break; }

pKey += nKey + 1;

nKey = strcspn(pKey, "\\"); }

if (hKey == NULL) {

cout << "Invalid key.\n";

continue;

}

if (RegQueryValueEx(hKey, pKey, NULL, &dwType, NULL,&dwSize) == ERROR_SUCCESS) {

pBuffer = (unsigned char *)malloc(dwSize);

if (pBuffer == NULL) {

cout << "Insufficient memory.\n";

break; }

if (RegQueryValueEx(hKey, pKey, NULL, &dwType, pBuffer,&dwSize) == ERROR_SUCCESS)

printval(pBuffer, dwType, dwSize);

else

cout << "Error reading key.\n";

free(pBuffer);

}

else

cout << "Error reading key.\n";

RegCloseKey(hKey);

} }

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]