Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нужно сделать лабораторную по межпроцессному обмену

26K
29 апреля 2007 года
Student_Ilya
7 / / 29.04.2007
Требуется помощь в выполнении лаб. работы по программированию в Unix на C++. Сроки поджимают, а я веб-программист и в С++ не понимаю. :(

Задача:
Цитата:
Содержание работы: Обмен данными между процессами или нитями UNIX.
Родительский процесс (или нить) создает одну из двух команд, согласно индивидуальному заданию: одна по работе со строками, другая по работе с файлами. Команды состоят из названия команды или ее номера и сопроводительной информации (строки, имена файлов).
Дочерний процесс (или нить) принимает команды и выполняет их и посылает родительскому процессу (или нити) сообщение о причине невыполнения команды или результат.
Данные между двумя процессами (нитями), передаются с помощью одного из средств межпроцессного обмена. Для синхронизации доступа к общему ресурсу используется одно из средств (сигнал или семафор, если используются процессы, и мьютексы, если используются нити). В случае обмена через сокеты синхронизация не нужна.
Работа с процессами, нитями, средствами доступа и средствами синхронизации доступа выполняется путем выполнения системных вызовов из программы на C++.



Задание по варианту:

Цитата:
S – команда обработки строк (1 - 6):
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 нити



Вот код:

Цитата:
#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;

}

26K
29 апреля 2007 года
Student_Ilya
7 / / 29.04.2007
Писать на ICQ 398001850. Вознаграждение - 300 р. Выплачу в WMR.

В случае успешного и быстрого выполнения сотрудничество будет продолжено, т.к. нужно еще 2 лаб. работы сдавать.
26K
29 апреля 2007 года
Student_Ilya
7 / / 29.04.2007
Срок - до утра 2 мая.
26K
29 апреля 2007 года
Student_Ilya
7 / / 29.04.2007
Методичка по этой лаб. работе - http://forum.ishodniki.ru/index.php?action=dlattach;topic=11372.0;attach=1979
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог