- •Завдання
- •Теоретичні відомості
- •Завдання 1
- •Лістинг програми
- •Результат роботи програми
- •Завдання 2
- •Лістинг програми
- •Результат роботи програми
- •Завдання 3
- •Лістинги програм
- •Результати виконання програм
- •Завдання 4
- •Лістинги програм
- •Результати виконання програм
- •Завдання 5
- •Лістинги програм
- •Результати виконання програм
- •Завдання 6
- •Результат виконання завдання
- •Висновок
Результати виконання програм
Програма а:
Програма б:
Завдання 5
Семафори.
Задано рядок S, і безліч пар символів (ai, bi) i = 1, 2 ... n, отримати новий рядок, замінивши в рядку S кожне входження ai символу на bi. Вхідні дані: рядок S довільної довжини, ціле додатнє число n, безліч пар символів (ai, bi) i = 1, 2 ... n. Для вирішення завдання використати чотири процеси (потоки), розділивши між ними рядок S.
Лістинги програм
Програма а:
#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<sys/wait.h>
#include<string.h>
int semid;
sembuf Plus1 = { 0, 1, 0 };
sembuf Minus1 = { 0, -1, 0 };
void func(int, char[], int[]);
void clear();
void space();
char s[100][2];
int n;
int main()
{
char str[] = "";
static int mas[100];
semid = semget(IPC_PRIVATE, 1, IPC_CREAT|0666) ;
if (semid < 0)
{
printf("Error\n");
return 0;
}
printf("Enter string: ");
scanf("%s", str);
printf("Enter N:");
scanf("%d", &n);
int i;
printf("Enter symbols:\n");
for (i = 0; i < n; i++)
{
clear();
scanf("%c", &s[i][0]);
space();
scanf("%c", &s[i][1]);
}
semop(semid, &Plus1, 1);
for (i = 0; i < 4; i++)
{
if (fork() == 0)
{
func(i, str, mas);
return 1;
}
}
for (i = 0; i < 4; i++)
{
wait(NULL);
}
printf("Result:\n");
printf("%s\n", str);
return 1;
}
void func(int part, char str[], int mas[])
{
semop(semid, &Minus1, 1);
int tmpLen = strlen(str) / 4;
int start = part * tmpLen;
int end = start + tmpLen;
if (part == 3)
{
end = strlen(str);
}
int i, j;
for(i = start; i < end; i++)
{
for (j = 0; j < n; j++)
{
if ((str[i] == s[j][0]) && (mas[i] == 0))
{
str[i] = s[j][1];
mas[i] = 1;
}
}
}
semop(semid, &Plus1, 1);
}
void clear()
{
while(getchar() != '\n');
}
void space()
{
while(getchar() != ' ');
}
Програма б:
#include<sched.h>
#include<stdio.h>
#include<unistd.h>
#include<semaphore.h>
#include<string.h>
#define NUMSTACK 5000
char stack[4][ NUMSTACK];
int count = 0;
int n;
char str[] = "";
char s[100][2];
static int mas[100];
int func(void *);
void clear();
void space();
sem_t sem1;
sem_t sem2;
int main()
{
printf("Enter string: ");
scanf("%s", str);
printf("Enter N:");
scanf("%d", &n);
int i;
printf("Enter symbols:\n");
for (i = 0; i < n; i++)
{
clear();
scanf("%c", &s[i][0]);
space();
scanf("%c", &s[i][1]);
}
sem_init(&sem1, 1, 1);
sem_init(&sem2, 1, 0);
for (i = 0; i < 4; i++)
{
char *tostack = stack[i];
clone(func, (void*)(tostack+NUMSTACK-1), CLONE_VM, NULL);
}
for (i = 0; i < 4; i++)
{
sem_wait(&sem2);
}
printf("Result:\n");
printf("%s\n", str);
return 1;
}
int func(void *param)
{
int tmpLen = strlen(str) / 4;
int start = count * tmpLen;
int end = start + tmpLen;
if (count == 3)
{
end = strlen(str);
}
int i, j;
for(i = start; i < end; i++)
{
for (j = 0; j < n; j++)
{
if ((str[i] == s[j][0]) && (mas[i] == 0))
{
str[i] = s[j][1];
mas[i] = 1;
}
}
}
count += 1;
sem_post(&sem1);
sem_post(&sem2);
return 1;
}
void clear()
{
while(getchar() != '\n');
}
void space()
{
while(getchar() != ' ');
}
