Перейти к публикации
  • Сейчас на странице   Всего пользователей: 2   (0 пользователей, 2 гостя)

Hed-kun

Программирование, т. 5.1.

Рекомендованные сообщения

да пошли вы нахуй(

внеси свои лейблы в другой массив и перебирай их.

Поделиться сообщением


Ссылка на сообщение

кто-нибудь покупал ЛВЛа на джавараш? стоит ли?

Поделиться сообщением


Ссылка на сообщение

конечно стоит, ты же от этого станешь гениальным программистом, и сразу изобретешь свой фейсбук и гугл с геошерингом


Мобильное приложение для продоты https://play.google....id=ru.prodota.m

Поделиться сообщением


Ссылка на сообщение

мммммммммммммммм найс спасиба пошел оплачивать

Поделиться сообщением


Ссылка на сообщение

Хуйня вопрос, но энивей. Есть у кого ресурсы(или мб какие-нибудь найс ролики на ютубе) по сишарпу? Не основы офк(хотя думаю они лишними не будут если есть).


2431.png.289b73eb1e1d8ac3899623c8c8e991f1.png

Поделиться сообщением


Ссылка на сообщение

Видосы только для конференций. Остальное - книги, гугл и побольше практики. Очень много практики

Поделиться сообщением


Ссылка на сообщение

Чет никогда не думал, что буду спрашивать на пд как делать лабы, сам справлялся, но что-то вот эта хуйня для меня слишком сложна, а точнее, я просто не понимаю, где может быть ошибка.

Итак: есть лаба сделанная одногруппником, нужно всего лишь переделать ее под мое условие, казалось бы, чего проще, но что-то не так

 

Задание одногруппника

Два дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через очередь сообщений родительскому процессу очередные четыре строки некоторого стихотворения, при этом первый процесс передает нечетные четырехстишья, второй - четные. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы обоих процессов.

 

 

Код одногруппника

http://pastebin.com/8Dm6swQv

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct mesgbuf {
long mtype;
char buff[1024];
} mesg;

char *data[] = {
"Гой ты, Русь, моя родная,\n\
Хаты - в ризах образа...\n\
Не видать конца и края -\n\
Только синь сосет глаза.\n\n",

"Как захожий богомолец,\n\
Я смотрю твои поля.\n\
А у низеньких околиц\n\
Звонно чахнут тополя.\n\n",

"Пахнет яблоком и медом\n\
По церквам твой кроткий Спас.\n\
И гудит за корогодом\n\
На лугах веселый пляс.\n\n",

"Побегу по мятой стежке\n\
На приволь зеленых лех,\n\
Мне навстречу, как сережки,\n\
Прозвенит девичий смех.\n\n",

"Если крикнет рать святая:\n\
Кинь ты Русь, живи в раю!\n\
Я скажу: Не надо рая,\n\
Дайте родину мою.\n"
};

void parent_proc(void) { //Функция родительского процесса
mesg message;
key_t key;
int msgid, len;
int done = 0; //Показатель окончания передачи данных процессом
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений
message.mtype = 3L; //Тип сообщения 3 необходим для инициализации
message.buff[0] = 0; //дочерних процессов. Отправляются два таких
msgsnd(msgid, &message, sizeof(message), 0); //сообщения со значениями первого
message.buff[0] = 1; //байта 0 и 1
msgsnd(msgid, &message, sizeof(message), 0);
for (;;) {
 if ((done & 0x1) == 0) { //Если первый процесс ещё передаёт //данные, то получаем сообщение
  len = msgrcv(msgid, &message, sizeof(message), 1L, 0);
  if (message.buff[0] == 0) done |= 0x1; //Если это пустая
                                        //строка, то устанавливаем флаг завершения передачи
  else write(1, message.buff, len); //иначе выводим строку
 }
 if ((done & 0x2) == 0) { //Аналогично для второго процесса
  len = msgrcv(msgid, &message, sizeof(message), 2L, 0);
  if (message.buff[0] == 0) done |= 0x2;
  else write(1, message.buff, len);
 }
 if (done == 0x3) { //Если оба процесса завершили передачу, то
  msgctl(msgid, IPC_RMID, 0); //завершаем работу
 return;
 }
}
}
void child_proc(void) {
mesg message;
key_t key;
int msgid, whoami, str, len;
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0); //Открытие очереди сообщений
msgrcv(msgid, &message, sizeof(message), 3L, 0); //Получение сообщения инициализации
whoami = (int) message.buff[0]; //Номер процесса определяется содержанием сообщения
message.mtype = whoami + 1; //Тип сообщений, отправляемых данным процессом
for (str = 0; str < 5; str++) { //Цикл по четверостишиям
 if (str % 2 == whoami) { //В зависимости от номера, процесс будет передавать чётные или нечётные четверостишия
  len = sprintf(message.buff,"%s",data[str]);
  msgsnd(msgid, &message, len, 0); //Отправление сообщения
 }
}
message.buff[0] = 0;
msgsnd(msgid, &message, 1, 0); //Отправление сообщения о завершении
return;
}

int main() {
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
parent_proc();
return 0;
}

 

 

 

Мое задание

Четыре дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через один и тот же сегмент разделяемой памяти родительскому процессу очередную строку некоторого стихотворения, при этом первый процесс передает 1-ю, 5-ю, 9-ю и т.д. строки, второй - 2-ю, 6-ю, 10-ю и т.д. строки, третий - 3-ю, 7-ю, 11-ю и т.д. строки, четвертый - 4-ю, 8-ю, 12-ю и т.д. строки. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы всех процессов

 

 

Мой код

http://pastebin.com/YWZpCUZ7

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct mesgbuf {
long mtype;
char buff[1024];
} mesg;

char *data[] = {
"Люблю грозу в начале мая,\n",
"Когда весенний, первый гром,\n",
"как бы резвяся и играя,\n",
"Грохочет в небе голубом.\n",
"Гремят раскаты молодые,\n",
"Вот дождик брызнул, пыль летит,\n",
"Повисли перлы дождевые,\n",
"И солнце нити золотит.\n",
"С горы бежит поток проворный,\n",
"В лесу не молкнет птичий гам,\n",
"И гам лесной и шум нагорный -\n",
"Все вторит весело громам.\n",
"Ты скажешь: ветреная Геба,\n",
"Кормя Зевесова орла,\n",
"Громокипящий кубок с неба,\n",
"Смеясь, на землю пролила.\n"
};

void parent_proc(void) { //Функция родительского процесса
mesg message;
key_t key;
int msgid, len;
int done = 0; //Показатель окончания передачи данных процессом
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений
message.mtype = 5L; //Тип сообщения 3 необходим для инициализации
message.buff[0] = 0; //дочерних процессов. Отправляются два таких
msgsnd(msgid, &message, sizeof(message), 0); //сообщения со значениями первого
message.buff[0] = 1; //байта 0, 1, 2 или 3
msgsnd(msgid, &message, sizeof(message), 0);
message.buff[0] = 2;  
msgsnd(msgid, &message, sizeof(message), 0);
message.buff[0] = 3;
msgsnd(msgid, &message, sizeof(message), 0);
for (;;) {
 if ((done & 0x1) == 0) { //Если первый процесс ещё передаёт //данные, то получаем сообщение
  len = msgrcv(msgid, &message, sizeof(message), 1L, 0);
  if (message.buff[0] == 0) done |= 0x1; //Если это пустая
                                        //строка, то устанавливаем флаг завершения передачи
  else write(1, message.buff, len); //иначе выводим строку
 }
 if ((done & 0x2) == 0) { //Аналогично для второго процесса
  len = msgrcv(msgid, &message, sizeof(message), 2L, 0);
  if (message.buff[0] == 0) done |= 0x2;
  else write(1, message.buff, len);
 }
 if ((done & 0x3) == 0) { //Аналогично для третьего процесса
  len = msgrcv(msgid, &message, sizeof(message), 3L, 0);
  if (message.buff[0] == 0) done |= 0x3;
  else write(1, message.buff, len);
 }
 if ((done & 0x4) == 0) { //Аналогично для четвертого процесса
  len = msgrcv(msgid, &message, sizeof(message), 4L, 0);
  if (message.buff[0] == 0) done |= 0x4;
  else write(1, message.buff, len);
 }
 if (done == 0x5) { //Если все четыре процесса завершили передачу, то
  msgctl(msgid, IPC_RMID, 0); //завершаем работу
 return;
 }
}
}
void child_proc(void) {
mesg message;
key_t key;
int msgid, whoami, str, len;
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0); //Открытие очереди сообщений
msgrcv(msgid, &message, sizeof(message), 5L, 0); //Получение сообщения инициализации
whoami = (int) message.buff[0]; //Номер процесса определяется содержанием сообщения
message.mtype = whoami + 1; //Тип сообщений, отправляемых данным процессом
for (str = 0; str < 16; str++) { //Цикл по строкам
 if (str % 4 == whoami) { //В зависимости от номера процесса, процесс будет передавать различные строки
  len = sprintf(message.buff,"%s",data[str]);
  msgsnd(msgid, &message, len, 0); //Отправление сообщения
 }
}
message.buff[0] = 0;
msgsnd(msgid, &message, 1, 0); //Отправление сообщения о завершении
return;
}

int main() {
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
parent_proc();
return 0;
}

Моя программа никогда не завершается нормально, выводятся то одни, то другие строки, и приходится прерывать работу.

Ошибка, судя по всему, или в поле buff структуры, неправильно назначаю (где mesage.buff[0] = ...), или в функции msgrcv в аргументе msgtyp(предпоследний). Или вообще неправильное понимание того, как эта программа работает (не понимаю, если честно, как эти потоки между собой взаимодействуют)

Посмотрите пожалуйста, может увидите ошибку. Заранее спасибо :smile:

Поделиться сообщением


Ссылка на сообщение
(изменено)

У тебя и не должно быть взаимодействия между процессами. Там даже про буфер ничего не сказано, и сказано что циклы не сбалансированы по времени. То есть результат и должен быть любой.

 

По крайней мере я так понял.


Изменено пользователем Двапой

Мобильное приложение для продоты https://play.google....id=ru.prodota.m

Поделиться сообщением


Ссылка на сообщение

Чет никогда не думал, что буду спрашивать на пд как делать лабы, сам справлялся, но что-то вот эта хуйня для меня слишком сложна, а точнее, я просто не понимаю, где может быть ошибка.

Итак: есть лаба сделанная одногруппником, нужно всего лишь переделать ее под мое условие, казалось бы, чего проще, но что-то не так

 

Задание одногруппника

Два дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через очередь сообщений родительскому процессу очередные четыре строки некоторого стихотворения, при этом первый процесс передает нечетные четырехстишья, второй - четные. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы обоих процессов.

 

 

Код одногруппника

http://pastebin.com/8Dm6swQv

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct mesgbuf {
long mtype;
char buff[1024];
} mesg;

char *data[] = {
"Гой ты, Русь, моя родная,\n\
Хаты - в ризах образа...\n\
Не видать конца и края -\n\
Только синь сосет глаза.\n\n",

"Как захожий богомолец,\n\
Я смотрю твои поля.\n\
А у низеньких околиц\n\
Звонно чахнут тополя.\n\n",

"Пахнет яблоком и медом\n\
По церквам твой кроткий Спас.\n\
И гудит за корогодом\n\
На лугах веселый пляс.\n\n",

"Побегу по мятой стежке\n\
На приволь зеленых лех,\n\
Мне навстречу, как сережки,\n\
Прозвенит девичий смех.\n\n",

"Если крикнет рать святая:\n\
Кинь ты Русь, живи в раю!\n\
Я скажу: Не надо рая,\n\
Дайте родину мою.\n"
};

void parent_proc(void) { //Функция родительского процесса
mesg message;
key_t key;
int msgid, len;
int done = 0; //Показатель окончания передачи данных процессом
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений
message.mtype = 3L; //Тип сообщения 3 необходим для инициализации
message.buff[0] = 0; //дочерних процессов. Отправляются два таких
msgsnd(msgid, &message, sizeof(message), 0); //сообщения со значениями первого
message.buff[0] = 1; //байта 0 и 1
msgsnd(msgid, &message, sizeof(message), 0);
for (;;) {
 if ((done & 0x1) == 0) { //Если первый процесс ещё передаёт //данные, то получаем сообщение
  len = msgrcv(msgid, &message, sizeof(message), 1L, 0);
  if (message.buff[0] == 0) done |= 0x1; //Если это пустая
									 //строка, то устанавливаем флаг завершения передачи
  else write(1, message.buff, len); //иначе выводим строку
 }
 if ((done & 0x2) == 0) { //Аналогично для второго процесса
  len = msgrcv(msgid, &message, sizeof(message), 2L, 0);
  if (message.buff[0] == 0) done |= 0x2;
  else write(1, message.buff, len);
 }
 if (done == 0x3) { //Если оба процесса завершили передачу, то
  msgctl(msgid, IPC_RMID, 0); //завершаем работу
 return;
 }
}
}
void child_proc(void) {
mesg message;
key_t key;
int msgid, whoami, str, len;
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0); //Открытие очереди сообщений
msgrcv(msgid, &message, sizeof(message), 3L, 0); //Получение сообщения инициализации
whoami = (int) message.buff[0]; //Номер процесса определяется содержанием сообщения
message.mtype = whoami + 1; //Тип сообщений, отправляемых данным процессом
for (str = 0; str < 5; str++) { //Цикл по четверостишиям
 if (str % 2 == whoami) { //В зависимости от номера, процесс будет передавать чётные или нечётные четверостишия
  len = sprintf(message.buff,"%s",data[str]);
  msgsnd(msgid, &message, len, 0); //Отправление сообщения
 }
}
message.buff[0] = 0;
msgsnd(msgid, &message, 1, 0); //Отправление сообщения о завершении
return;
}

int main() {
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
parent_proc();
return 0;
}

 

 

 

Мое задание

Четыре дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через один и тот же сегмент разделяемой памяти родительскому процессу очередную строку некоторого стихотворения, при этом первый процесс передает 1-ю, 5-ю, 9-ю и т.д. строки, второй - 2-ю, 6-ю, 10-ю и т.д. строки, третий - 3-ю, 7-ю, 11-ю и т.д. строки, четвертый - 4-ю, 8-ю, 12-ю и т.д. строки. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы всех процессов

 

 

Мой код

http://pastebin.com/YWZpCUZ7

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct mesgbuf {
long mtype;
char buff[1024];
} mesg;

char *data[] = {
"Люблю грозу в начале мая,\n",
"Когда весенний, первый гром,\n",
"как бы резвяся и играя,\n",
"Грохочет в небе голубом.\n",
"Гремят раскаты молодые,\n",
"Вот дождик брызнул, пыль летит,\n",
"Повисли перлы дождевые,\n",
"И солнце нити золотит.\n",
"С горы бежит поток проворный,\n",
"В лесу не молкнет птичий гам,\n",
"И гам лесной и шум нагорный -\n",
"Все вторит весело громам.\n",
"Ты скажешь: ветреная Геба,\n",
"Кормя Зевесова орла,\n",
"Громокипящий кубок с неба,\n",
"Смеясь, на землю пролила.\n"
};

void parent_proc(void) { //Функция родительского процесса
mesg message;
key_t key;
int msgid, len;
int done = 0; //Показатель окончания передачи данных процессом
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений
message.mtype = 5L; //Тип сообщения 3 необходим для инициализации
message.buff[0] = 0; //дочерних процессов. Отправляются два таких
msgsnd(msgid, &message, sizeof(message), 0); //сообщения со значениями первого
message.buff[0] = 1; //байта 0, 1, 2 или 3
msgsnd(msgid, &message, sizeof(message), 0);
message.buff[0] = 2;  
msgsnd(msgid, &message, sizeof(message), 0);
message.buff[0] = 3;
msgsnd(msgid, &message, sizeof(message), 0);
for (;;) {
 if ((done & 0x1) == 0) { //Если первый процесс ещё передаёт //данные, то получаем сообщение
  len = msgrcv(msgid, &message, sizeof(message), 1L, 0);
  if (message.buff[0] == 0) done |= 0x1; //Если это пустая
									 //строка, то устанавливаем флаг завершения передачи
  else write(1, message.buff, len); //иначе выводим строку
 }
 if ((done & 0x2) == 0) { //Аналогично для второго процесса
  len = msgrcv(msgid, &message, sizeof(message), 2L, 0);
  if (message.buff[0] == 0) done |= 0x2;
  else write(1, message.buff, len);
 }
 if ((done & 0x3) == 0) { //Аналогично для третьего процесса
  len = msgrcv(msgid, &message, sizeof(message), 3L, 0);
  if (message.buff[0] == 0) done |= 0x3;
  else write(1, message.buff, len);
 }
 if ((done & 0x4) == 0) { //Аналогично для четвертого процесса
  len = msgrcv(msgid, &message, sizeof(message), 4L, 0);
  if (message.buff[0] == 0) done |= 0x4;
  else write(1, message.buff, len);
 }
 if (done == 0x5) { //Если все четыре процесса завершили передачу, то
  msgctl(msgid, IPC_RMID, 0); //завершаем работу
 return;
 }
}
}
void child_proc(void) {
mesg message;
key_t key;
int msgid, whoami, str, len;
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0); //Открытие очереди сообщений
msgrcv(msgid, &message, sizeof(message), 5L, 0); //Получение сообщения инициализации
whoami = (int) message.buff[0]; //Номер процесса определяется содержанием сообщения
message.mtype = whoami + 1; //Тип сообщений, отправляемых данным процессом
for (str = 0; str < 16; str++) { //Цикл по строкам
 if (str % 4 == whoami) { //В зависимости от номера процесса, процесс будет передавать различные строки
  len = sprintf(message.buff,"%s",data[str]);
  msgsnd(msgid, &message, len, 0); //Отправление сообщения
 }
}
message.buff[0] = 0;
msgsnd(msgid, &message, 1, 0); //Отправление сообщения о завершении
return;
}

int main() {
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
parent_proc();
return 0;
}

Моя программа никогда не завершается нормально, выводятся то одни, то другие строки, и приходится прерывать работу.

Ошибка, судя по всему, или в поле buff структуры, неправильно назначаю (где mesage.buff[0] = ...), или в функции msgrcv в аргументе msgtyp(предпоследний). Или вообще неправильное понимание того, как эта программа работает (не понимаю, если честно, как эти потоки между собой взаимодействуют)

Посмотрите пожалуйста, может увидите ошибку. Заранее спасибо :smile:

Пока что все не смотрел, но первое что неправильно бросается в глаза, это done & 01 02 03 04. ты биты проверять должен а не цифры, поэтому 01 02 04 08

Поделиться сообщением


Ссылка на сообщение

У тебя и не должно быть взаимодействия между процессами. Там даже про буфер ничего не сказано, и сказано что циклы не сбалансированы по времени. То есть результат и должен быть любой.

 

По крайней мере я так понял.

да, забыл добавить, что на это пофиг, главное, чтобы выглядело, как будто сделал (шарашкин универ)

Поделиться сообщением


Ссылка на сообщение

я не буду ничего говорить, cpp выглядит страшновато, может это твой код конечно

 

но вот что я знаю точно, если тинплз скинет тебе работающее решение, то ты больше сюда не вернешься...


Мобильное приложение для продоты https://play.google....id=ru.prodota.m

Поделиться сообщением


Ссылка на сообщение
(изменено)

Чет никогда не думал, что буду спрашивать на пд как делать лабы, сам справлялся, но что-то вот эта хуйня для меня слишком сложна, а точнее, я просто не понимаю, где может быть ошибка.

Итак: есть лаба сделанная одногруппником, нужно всего лишь переделать ее под мое условие, казалось бы, чего проще, но что-то не так

 

Задание одногруппника

Два дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через очередь сообщений родительскому процессу очередные четыре строки некоторого стихотворения, при этом первый процесс передает нечетные четырехстишья, второй - четные. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы обоих процессов.

 

 

Код одногруппника

http://pastebin.com/8Dm6swQv

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct mesgbuf {
long mtype;
char buff[1024];
} mesg;

char *data[] = {
"Гой ты, Русь, моя родная,\n\
Хаты - в ризах образа...\n\
Не видать конца и края -\n\
Только синь сосет глаза.\n\n",

"Как захожий богомолец,\n\
Я смотрю твои поля.\n\
А у низеньких околиц\n\
Звонно чахнут тополя.\n\n",

"Пахнет яблоком и медом\n\
По церквам твой кроткий Спас.\n\
И гудит за корогодом\n\
На лугах веселый пляс.\n\n",

"Побегу по мятой стежке\n\
На приволь зеленых лех,\n\
Мне навстречу, как сережки,\n\
Прозвенит девичий смех.\n\n",

"Если крикнет рать святая:\n\
Кинь ты Русь, живи в раю!\n\
Я скажу: Не надо рая,\n\
Дайте родину мою.\n"
};

void parent_proc(void) { //Функция родительского процесса
mesg message;
key_t key;
int msgid, len;
int done = 0; //Показатель окончания передачи данных процессом
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений
message.mtype = 3L; //Тип сообщения 3 необходим для инициализации
message.buff[0] = 0; //дочерних процессов. Отправляются два таких
msgsnd(msgid, &message, sizeof(message), 0); //сообщения со значениями первого
message.buff[0] = 1; //байта 0 и 1
msgsnd(msgid, &message, sizeof(message), 0);
for (;;) {
 if ((done & 0x1) == 0) { //Если первый процесс ещё передаёт //данные, то получаем сообщение
  len = msgrcv(msgid, &message, sizeof(message), 1L, 0);
  if (message.buff[0] == 0) done |= 0x1; //Если это пустая
									 //строка, то устанавливаем флаг завершения передачи
  else write(1, message.buff, len); //иначе выводим строку
 }
 if ((done & 0x2) == 0) { //Аналогично для второго процесса
  len = msgrcv(msgid, &message, sizeof(message), 2L, 0);
  if (message.buff[0] == 0) done |= 0x2;
  else write(1, message.buff, len);
 }
 if (done == 0x3) { //Если оба процесса завершили передачу, то
  msgctl(msgid, IPC_RMID, 0); //завершаем работу
 return;
 }
}
}
void child_proc(void) {
mesg message;
key_t key;
int msgid, whoami, str, len;
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0); //Открытие очереди сообщений
msgrcv(msgid, &message, sizeof(message), 3L, 0); //Получение сообщения инициализации
whoami = (int) message.buff[0]; //Номер процесса определяется содержанием сообщения
message.mtype = whoami + 1; //Тип сообщений, отправляемых данным процессом
for (str = 0; str < 5; str++) { //Цикл по четверостишиям
 if (str % 2 == whoami) { //В зависимости от номера, процесс будет передавать чётные или нечётные четверостишия
  len = sprintf(message.buff,"%s",data[str]);
  msgsnd(msgid, &message, len, 0); //Отправление сообщения
 }
}
message.buff[0] = 0;
msgsnd(msgid, &message, 1, 0); //Отправление сообщения о завершении
return;
}

int main() {
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
parent_proc();
return 0;
}

 

 

 

Мое задание

Четыре дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через один и тот же сегмент разделяемой памяти родительскому процессу очередную строку некоторого стихотворения, при этом первый процесс передает 1-ю, 5-ю, 9-ю и т.д. строки, второй - 2-ю, 6-ю, 10-ю и т.д. строки, третий - 3-ю, 7-ю, 11-ю и т.д. строки, четвертый - 4-ю, 8-ю, 12-ю и т.д. строки. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы всех процессов

 

 

Мой код

http://pastebin.com/YWZpCUZ7

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct mesgbuf {
long mtype;
char buff[1024];
} mesg;

char *data[] = {
"Люблю грозу в начале мая,\n",
"Когда весенний, первый гром,\n",
"как бы резвяся и играя,\n",
"Грохочет в небе голубом.\n",
"Гремят раскаты молодые,\n",
"Вот дождик брызнул, пыль летит,\n",
"Повисли перлы дождевые,\n",
"И солнце нити золотит.\n",
"С горы бежит поток проворный,\n",
"В лесу не молкнет птичий гам,\n",
"И гам лесной и шум нагорный -\n",
"Все вторит весело громам.\n",
"Ты скажешь: ветреная Геба,\n",
"Кормя Зевесова орла,\n",
"Громокипящий кубок с неба,\n",
"Смеясь, на землю пролила.\n"
};

void parent_proc(void) { //Функция родительского процесса
mesg message;
key_t key;
int msgid, len;
int done = 0; //Показатель окончания передачи данных процессом
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений
message.mtype = 5L; //Тип сообщения 3 необходим для инициализации
message.buff[0] = 0; //дочерних процессов. Отправляются два таких
msgsnd(msgid, &message, sizeof(message), 0); //сообщения со значениями первого
message.buff[0] = 1; //байта 0, 1, 2 или 3
msgsnd(msgid, &message, sizeof(message), 0);
message.buff[0] = 2;  
msgsnd(msgid, &message, sizeof(message), 0);
message.buff[0] = 3;
msgsnd(msgid, &message, sizeof(message), 0);
for (;;) {
 if ((done & 0x1) == 0) { //Если первый процесс ещё передаёт //данные, то получаем сообщение
  len = msgrcv(msgid, &message, sizeof(message), 1L, 0);
  if (message.buff[0] == 0) done |= 0x1; //Если это пустая
									 //строка, то устанавливаем флаг завершения передачи
  else write(1, message.buff, len); //иначе выводим строку
 }
 if ((done & 0x2) == 0) { //Аналогично для второго процесса
  len = msgrcv(msgid, &message, sizeof(message), 2L, 0);
  if (message.buff[0] == 0) done |= 0x2;
  else write(1, message.buff, len);
 }
 if ((done & 0x3) == 0) { //Аналогично для третьего процесса
  len = msgrcv(msgid, &message, sizeof(message), 3L, 0);
  if (message.buff[0] == 0) done |= 0x3;
  else write(1, message.buff, len);
 }
 if ((done & 0x4) == 0) { //Аналогично для четвертого процесса
  len = msgrcv(msgid, &message, sizeof(message), 4L, 0);
  if (message.buff[0] == 0) done |= 0x4;
  else write(1, message.buff, len);
 }
 if (done == 0x5) { //Если все четыре процесса завершили передачу, то
  msgctl(msgid, IPC_RMID, 0); //завершаем работу
 return;
 }
}
}
void child_proc(void) {
mesg message;
key_t key;
int msgid, whoami, str, len;
key = ftok("data", 'A'); //Получение ключа
msgid = msgget(key, 0); //Открытие очереди сообщений
msgrcv(msgid, &message, sizeof(message), 5L, 0); //Получение сообщения инициализации
whoami = (int) message.buff[0]; //Номер процесса определяется содержанием сообщения
message.mtype = whoami + 1; //Тип сообщений, отправляемых данным процессом
for (str = 0; str < 16; str++) { //Цикл по строкам
 if (str % 4 == whoami) { //В зависимости от номера процесса, процесс будет передавать различные строки
  len = sprintf(message.buff,"%s",data[str]);
  msgsnd(msgid, &message, len, 0); //Отправление сообщения
 }
}
message.buff[0] = 0;
msgsnd(msgid, &message, 1, 0); //Отправление сообщения о завершении
return;
}

int main() {
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
if (!fork()) {
 child_proc();
 return 0;
}
parent_proc();
return 0;
}

Моя программа никогда не завершается нормально, выводятся то одни, то другие строки, и приходится прерывать работу.

Ошибка, судя по всему, или в поле buff структуры, неправильно назначаю (где mesage.buff[0] = ...), или в функции msgrcv в аргументе msgtyp(предпоследний). Или вообще неправильное понимание того, как эта программа работает (не понимаю, если честно, как эти потоки между собой взаимодействуют)

Посмотрите пожалуйста, может увидите ошибку. Заранее спасибо :smile:

Пока что все не смотрел, но первое что неправильно бросается в глаза, это done & 01 02 03 04. ты биты проверять должен а не цифры, поэтому 01 02 04 08

спасибо. Я даже сомневался, нужно было узнать, с чем это я done сравниваю. Вообще, если быстро не найдется ошибка, то покс. Придумаю, как сдать, если что

 

я не буду ничего говорить, cpp выглядит страшновато, может это твой код конечно

 

но вот что я знаю точно, если тинплз скинет тебе работающее решение, то ты больше сюда не вернешься...

это грустно, хочется, конечно, все понимать. Если хотя бы не уметь прогать, то хотя бы понимать, хоть часть. А вообще, C и C++ не мое, слишком тяжело там все
Изменено пользователем IOMOPHOu

Поделиться сообщением


Ссылка на сообщение

ну я реальной причины не знаю, куда люди пропадают, но такое было не раз


Мобильное приложение для продоты https://play.google....id=ru.prodota.m

Поделиться сообщением


Ссылка на сообщение
(изменено)

обосыте, но не бейте, ибо вопрос вообще тупой

написал в матлабе функцию построения графика по уравнению, все норм, только хз как квадратный корень в 3ю степень поставить, и гугл не помог :avtorklif:

ну и как размер шрифта увеличить в R2014 :trollface: но это уже просто сам нихуя не вижу


Изменено пользователем nobodies

Поделиться сообщением


Ссылка на сообщение

x^(3/2)

по другому никак? надеялся на команду ну ладн

Поделиться сообщением


Ссылка на сообщение

я не буду ничего говорить, cpp выглядит страшновато, может это твой код конечно

 

но вот что я знаю точно, если тинплз скинет тебе работающее решение, то ты больше сюда не вернешься...

ЖЗН

на первом курсе он помог мне

и мой препод такой говорит: а я чёт не могу понять этот код, я не мог дать такое задание

:lol:


 

4Ht5T.jpg

 

8FegEdj.jpg

Поделиться сообщением


Ссылка на сообщение

x^(3/2)

по другому никак? надеялся на команду ну ладн

не знаю

pow(sqrt(x), 3) так как-то


Мобильное приложение для продоты https://play.google....id=ru.prodota.m

Поделиться сообщением


Ссылка на сообщение

x^(3/2)

по другому никак? надеялся на команду ну ладн

Боюсь даже предположить зачем тебе по-другому.

 

я не буду ничего говорить, cpp выглядит страшновато, может это твой код конечно

 

но вот что я знаю точно, если тинплз скинет тебе работающее решение, то ты больше сюда не вернешься...

ЖЗН

на первом курсе он помог мне

и мой препод такой говорит: а я чёт не могу понять этот код, я не мог дать такое задание

:lol:

Ну да, а зачем писать кучу строк, если можно в 10-20 решить большинство универских задач по с++

Ты же попросил на С++ а не на С :)

А это немного разные вещи.

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...