Нужно сделать лабораторную по межпроцессному обмену
Задача:
Цитата:
Содержание работы: Обмен данными между процессами или нитями UNIX.
Родительский процесс (или нить) создает одну из двух команд, согласно индивидуальному заданию: одна по работе со строками, другая по работе с файлами. Команды состоят из названия команды или ее номера и сопроводительной информации (строки, имена файлов).
Дочерний процесс (или нить) принимает команды и выполняет их и посылает родительскому процессу (или нити) сообщение о причине невыполнения команды или результат.
Данные между двумя процессами (нитями), передаются с помощью одного из средств межпроцессного обмена. Для синхронизации доступа к общему ресурсу используется одно из средств (сигнал или семафор, если используются процессы, и мьютексы, если используются нити). В случае обмена через сокеты синхронизация не нужна.
Работа с процессами, нитями, средствами доступа и средствами синхронизации доступа выполняется путем выполнения системных вызовов из программы на C++.
Родительский процесс (или нить) создает одну из двух команд, согласно индивидуальному заданию: одна по работе со строками, другая по работе с файлами. Команды состоят из названия команды или ее номера и сопроводительной информации (строки, имена файлов).
Дочерний процесс (или нить) принимает команды и выполняет их и посылает родительскому процессу (или нити) сообщение о причине невыполнения команды или результат.
Данные между двумя процессами (нитями), передаются с помощью одного из средств межпроцессного обмена. Для синхронизации доступа к общему ресурсу используется одно из средств (сигнал или семафор, если используются процессы, и мьютексы, если используются нити). В случае обмена через сокеты синхронизация не нужна.
Работа с процессами, нитями, средствами доступа и средствами синхронизации доступа выполняется путем выполнения системных вызовов из программы на C++.
Задание по варианту:
Цитата:
S – команда обработки строк (1 - 6):
3. Подсчет средней длины слов строки (строка разделяется на слова с помощью звездочки)
F – команда обработки файла:
4. Удаление файла с указанным именем из заданного каталога
O -вариант обмена данными между процессами или нитями (1-6):
1. неименованный канал
X – вариант синхронизации доступа к общему ресурсу (1-3):
3. мьютекс
P- вариант организации приложения (1-2):
2. 2 нити
3. Подсчет средней длины слов строки (строка разделяется на слова с помощью звездочки)
F – команда обработки файла:
4. Удаление файла с указанным именем из заданного каталога
O -вариант обмена данными между процессами или нитями (1-6):
1. неименованный канал
X – вариант синхронизации доступа к общему ресурсу (1-3):
3. мьютекс
P- вариант организации приложения (1-2):
2. 2 нити
Чтобы было максимально понятно, прилагаю пример лабораторной под вариант:
Цитата:
S – команда обработки строк (1 - 6):
2. Подсчет длины текста
F – команда обработки файла:
2. Копирование файла с указанным именем в пределах одного каталога
O -вариант обмена данными между процессами или нитями (1-6):
2. именованный канал
X – вариант синхронизации доступа к общему ресурсу (1-3):
2. семафор
P- вариант организации приложения (1-2):
2. 2 нити
2. Подсчет длины текста
F – команда обработки файла:
2. Копирование файла с указанным именем в пределах одного каталога
O -вариант обмена данными между процессами или нитями (1-6):
2. именованный канал
X – вариант синхронизации доступа к общему ресурсу (1-3):
2. семафор
P- вариант организации приложения (1-2):
2. 2 нити
Вот код:
Цитата:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <semaphore.h>
#include <sys/shm.h>
#include <errno.h>
#include <fcntl.h>
#define TEXT_SIZE 100
#define FIFO "fifo.1" //FIFO filename
#define MAXBUFF 100 // message buffer
static struct sembuf sop_wait[2]={0,0,0};
static struct sembuf sop_inc[3]={0,1,0};
static struct sembuf sop_dec[4]={0,-1,0};
int readfd;
int parent(int semid) {
char selection; int n;
sleep(1);
char* st = (char*) malloc(TEXT_SIZE);
printf("Enter type of operation \n\r 1 - for calculating length of the text\n\r");
printf(" 2 - for making copy of a selected file\n\r");
printf("Your selection: ");
scanf("%s",st);
write(readfd,st, TEXT_SIZE); //Read from FIFO
selection=st[0];
if (selection=='1') {
printf("Enter text: ");
scanf("%s",st);
}
else
if (selection=='2') {
printf("Enter filename: ");
scanf("%s",st);
}
else {
printf("Invalid type of operation\n\r");
unlink(FIFO);
_exit(-1);
}
if (semop(semid,&sop_dec[0],1)==-1) { //Try to unlock FIFO
printf("perent semop error! \n");
return -1;
}
sleep(1);
semop(semid,&sop_wait[0],1);
if (semop(semid,&sop_inc[0],1)==-1) { //Try to lock FIFO by chprocess
printf("per semop error! \n");
return -1;
}
write(readfd,st, MAXBUFF); //Read from FIFO
if (semop(semid,&sop_dec[0],1)==-1) { //Try to unlock FIFO
printf("perent semop error! \n");
return -1;
}
sleep(1);
semop(semid,&sop_wait[0],1);
if (semop(semid,&sop_inc[0],1)==-1) { //Try to lock FIFO by chprocess
printf("Child semop error!11 \n");
return -1;
}
read(readfd, st, MAXBUFF); //Read from FIFO
printf("%s\n\r",st);
free(st);
};
int child(int semid) {
char selection;
int n;
printf("Child start\n");
semop(semid,&sop_wait[0],1);
char* st= (char*) malloc(TEXT_SIZE);
if (semop(semid,&sop_inc[0],1)==-1) {
printf("Child semop error! \n");
return -1;
}
read(readfd,st,TEXT_SIZE);
selection=st[0];
if (semop(semid,&sop_dec[0],1)==-1) { //Try to unlock FIFO
perror("Child semop error!!! \n");
return -1;
}
sleep(1);
semop(semid,&sop_wait[0],1);
if (semop(semid,&sop_inc[0],1)==-1) {
printf("Child semop error! \n");
return -1;
}
read(readfd, st, MAXBUFF);
char newfile[150];
switch(selection) {
case '1':
printf("Result\n Text lengh = %d\n",strlen(st));
write (readfd, "Success of calc text size!!!\n", TEXT_SIZE);
break;
case '2':
strcpy(newfile,st);
strcat(newfile,".copy");
if (link(st,newfile)!=-1) {
strcpy(st,"Result\n File was copyred,new file name ");
strcat(st,newfile);
//str
write (readfd,st, TEXT_SIZE);
}
else
{ unlink(FIFO);
strcpy(newfile,"Error copying file ");
strcat(newfile,st);
perror(newfile);
_exit(-1);
}
};
if (semop(semid,&sop_dec[0],1)==-1) {
printf("Child semop error! \n");
return -1;
}
}
int main(int argc, char* args[]) {
pthread_t thid;
char buff[MAXBUFF]; //buffer for message
int semid,keyy, result;
if (mknod(FIFO, S_IFIFO | S_IRWXU | 0777, 0)<0) { //Create FIFO
printf("Cannot create FIFO! \n");
return -1;
}
else
printf("FIFO created! \n");
if ((readfd=open(FIFO, O_RDWR))<0) { //Open FIFO for read
printf("Cannot open FIFO! \n");
return -1 ;
};
printf("FIFO opened! \n");
keyy=ftok(FIFO,'u'); //Get session key
semid=semget(IPC_PRIVATE, 1,IPC_CREAT + 0777); //Create semafor
if (semid==-1) {
perror("Cannot create semafor! \n");
return -1;
}
else
printf("Semafor created! \n");
if(semop(semid,&sop_inc[0],1)==-1) {perror("afs\n");};
result =pthread_create( &thid, (pthread_attr_t *)NULL,(void* (*)(void*))child,(void*)semid);/*if(result != 0){
parent(semid);
/*mythid = pthread_self();a = a+1;
printf(пїЅпїЅ %d, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ = %d\n", mythid, a);*/
parent(semid);
pthread_join(thid, (void **)NULL);
close(readfd);
if (unlink(FIFO)<0) {printf("Could not delete FIFO"); return 1;};
printf("Have a nice day!!!\n");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <semaphore.h>
#include <sys/shm.h>
#include <errno.h>
#include <fcntl.h>
#define TEXT_SIZE 100
#define FIFO "fifo.1" //FIFO filename
#define MAXBUFF 100 // message buffer
static struct sembuf sop_wait[2]={0,0,0};
static struct sembuf sop_inc[3]={0,1,0};
static struct sembuf sop_dec[4]={0,-1,0};
int readfd;
int parent(int semid) {
char selection; int n;
sleep(1);
char* st = (char*) malloc(TEXT_SIZE);
printf("Enter type of operation \n\r 1 - for calculating length of the text\n\r");
printf(" 2 - for making copy of a selected file\n\r");
printf("Your selection: ");
scanf("%s",st);
write(readfd,st, TEXT_SIZE); //Read from FIFO
selection=st[0];
if (selection=='1') {
printf("Enter text: ");
scanf("%s",st);
}
else
if (selection=='2') {
printf("Enter filename: ");
scanf("%s",st);
}
else {
printf("Invalid type of operation\n\r");
unlink(FIFO);
_exit(-1);
}
if (semop(semid,&sop_dec[0],1)==-1) { //Try to unlock FIFO
printf("perent semop error! \n");
return -1;
}
sleep(1);
semop(semid,&sop_wait[0],1);
if (semop(semid,&sop_inc[0],1)==-1) { //Try to lock FIFO by chprocess
printf("per semop error! \n");
return -1;
}
write(readfd,st, MAXBUFF); //Read from FIFO
if (semop(semid,&sop_dec[0],1)==-1) { //Try to unlock FIFO
printf("perent semop error! \n");
return -1;
}
sleep(1);
semop(semid,&sop_wait[0],1);
if (semop(semid,&sop_inc[0],1)==-1) { //Try to lock FIFO by chprocess
printf("Child semop error!11 \n");
return -1;
}
read(readfd, st, MAXBUFF); //Read from FIFO
printf("%s\n\r",st);
free(st);
};
int child(int semid) {
char selection;
int n;
printf("Child start\n");
semop(semid,&sop_wait[0],1);
char* st= (char*) malloc(TEXT_SIZE);
if (semop(semid,&sop_inc[0],1)==-1) {
printf("Child semop error! \n");
return -1;
}
read(readfd,st,TEXT_SIZE);
selection=st[0];
if (semop(semid,&sop_dec[0],1)==-1) { //Try to unlock FIFO
perror("Child semop error!!! \n");
return -1;
}
sleep(1);
semop(semid,&sop_wait[0],1);
if (semop(semid,&sop_inc[0],1)==-1) {
printf("Child semop error! \n");
return -1;
}
read(readfd, st, MAXBUFF);
char newfile[150];
switch(selection) {
case '1':
printf("Result\n Text lengh = %d\n",strlen(st));
write (readfd, "Success of calc text size!!!\n", TEXT_SIZE);
break;
case '2':
strcpy(newfile,st);
strcat(newfile,".copy");
if (link(st,newfile)!=-1) {
strcpy(st,"Result\n File was copyred,new file name ");
strcat(st,newfile);
//str
write (readfd,st, TEXT_SIZE);
}
else
{ unlink(FIFO);
strcpy(newfile,"Error copying file ");
strcat(newfile,st);
perror(newfile);
_exit(-1);
}
};
if (semop(semid,&sop_dec[0],1)==-1) {
printf("Child semop error! \n");
return -1;
}
}
int main(int argc, char* args[]) {
pthread_t thid;
char buff[MAXBUFF]; //buffer for message
int semid,keyy, result;
if (mknod(FIFO, S_IFIFO | S_IRWXU | 0777, 0)<0) { //Create FIFO
printf("Cannot create FIFO! \n");
return -1;
}
else
printf("FIFO created! \n");
if ((readfd=open(FIFO, O_RDWR))<0) { //Open FIFO for read
printf("Cannot open FIFO! \n");
return -1 ;
};
printf("FIFO opened! \n");
keyy=ftok(FIFO,'u'); //Get session key
semid=semget(IPC_PRIVATE, 1,IPC_CREAT + 0777); //Create semafor
if (semid==-1) {
perror("Cannot create semafor! \n");
return -1;
}
else
printf("Semafor created! \n");
if(semop(semid,&sop_inc[0],1)==-1) {perror("afs\n");};
result =pthread_create( &thid, (pthread_attr_t *)NULL,(void* (*)(void*))child,(void*)semid);/*if(result != 0){
parent(semid);
/*mythid = pthread_self();a = a+1;
printf(пїЅпїЅ %d, пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ = %d\n", mythid, a);*/
parent(semid);
pthread_join(thid, (void **)NULL);
close(readfd);
if (unlink(FIFO)<0) {printf("Could not delete FIFO"); return 1;};
printf("Have a nice day!!!\n");
return 0;
}
В случае успешного и быстрого выполнения сотрудничество будет продолжено, т.к. нужно еще 2 лаб. работы сдавать.
Срок - до утра 2 мая.
Методичка по этой лаб. работе -