eGokku #9421 3 июня 2015 да пошли вы нахуй(внеси свои лейблы в другой массив и перебирай их. Поделиться сообщением Ссылка на сообщение
NZRK #9422 3 июня 2015 кто-нибудь покупал ЛВЛа на джавараш? стоит ли? Поделиться сообщением Ссылка на сообщение
Двапой #9423 3 июня 2015 конечно стоит, ты же от этого станешь гениальным программистом, и сразу изобретешь свой фейсбук и гугл с геошерингом Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
NZRK #9424 3 июня 2015 мммммммммммммммм найс спасиба пошел оплачивать Поделиться сообщением Ссылка на сообщение
RDT3K #9425 3 июня 2015 Хуйня вопрос, но энивей. Есть у кого ресурсы(или мб какие-нибудь найс ролики на ютубе) по сишарпу? Не основы офк(хотя думаю они лишними не будут если есть). Поделиться сообщением Ссылка на сообщение
Двапой #9426 3 июня 2015 учить программирование по ютубу это пять Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
Tinplz #9427 3 июня 2015 Видосы только для конференций. Остальное - книги, гугл и побольше практики. Очень много практики Поделиться сообщением Ссылка на сообщение
IOMOPHOu #9428 3 июня 2015 Чет никогда не думал, что буду спрашивать на пд как делать лабы, сам справлялся, но что-то вот эта хуйня для меня слишком сложна, а точнее, я просто не понимаю, где может быть ошибка.Итак: есть лаба сделанная одногруппником, нужно всего лишь переделать ее под мое условие, казалось бы, чего проще, но что-то не так Задание одногруппникаДва дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через очередь сообщений родительскому процессу очередные четыре строки некоторого стихотворения, при этом первый процесс передает нечетные четырехстишья, второй - четные. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы обоих процессов. Код одногруппника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(предпоследний). Или вообще неправильное понимание того, как эта программа работает (не понимаю, если честно, как эти потоки между собой взаимодействуют)Посмотрите пожалуйста, может увидите ошибку. Заранее спасибо Поделиться сообщением Ссылка на сообщение
Двапой #9429 3 июня 2015 (изменено) У тебя и не должно быть взаимодействия между процессами. Там даже про буфер ничего не сказано, и сказано что циклы не сбалансированы по времени. То есть результат и должен быть любой. По крайней мере я так понял. Изменено 3 июня 2015 пользователем Двапой Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
Tinplz #9430 3 июня 2015 Чет никогда не думал, что буду спрашивать на пд как делать лабы, сам справлялся, но что-то вот эта хуйня для меня слишком сложна, а точнее, я просто не понимаю, где может быть ошибка.Итак: есть лаба сделанная одногруппником, нужно всего лишь переделать ее под мое условие, казалось бы, чего проще, но что-то не так Задание одногруппникаДва дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через очередь сообщений родительскому процессу очередные четыре строки некоторого стихотворения, при этом первый процесс передает нечетные четырехстишья, второй - четные. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы обоих процессов. Код одногруппника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(предпоследний). Или вообще неправильное понимание того, как эта программа работает (не понимаю, если честно, как эти потоки между собой взаимодействуют)Посмотрите пожалуйста, может увидите ошибку. Заранее спасибо Пока что все не смотрел, но первое что неправильно бросается в глаза, это done & 01 02 03 04. ты биты проверять должен а не цифры, поэтому 01 02 04 08 Поделиться сообщением Ссылка на сообщение
IOMOPHOu #9431 3 июня 2015 У тебя и не должно быть взаимодействия между процессами. Там даже про буфер ничего не сказано, и сказано что циклы не сбалансированы по времени. То есть результат и должен быть любой. По крайней мере я так понял.да, забыл добавить, что на это пофиг, главное, чтобы выглядело, как будто сделал (шарашкин универ) Поделиться сообщением Ссылка на сообщение
Двапой #9432 3 июня 2015 я не буду ничего говорить, cpp выглядит страшновато, может это твой код конечно но вот что я знаю точно, если тинплз скинет тебе работающее решение, то ты больше сюда не вернешься... Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
IOMOPHOu #9433 3 июня 2015 (изменено) Чет никогда не думал, что буду спрашивать на пд как делать лабы, сам справлялся, но что-то вот эта хуйня для меня слишком сложна, а точнее, я просто не понимаю, где может быть ошибка.Итак: есть лаба сделанная одногруппником, нужно всего лишь переделать ее под мое условие, казалось бы, чего проще, но что-то не так Задание одногруппникаДва дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через очередь сообщений родительскому процессу очередные четыре строки некоторого стихотворения, при этом первый процесс передает нечетные четырехстишья, второй - четные. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы обоих процессов. Код одногруппника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(предпоследний). Или вообще неправильное понимание того, как эта программа работает (не понимаю, если честно, как эти потоки между собой взаимодействуют)Посмотрите пожалуйста, может увидите ошибку. Заранее спасибо Пока что все не смотрел, но первое что неправильно бросается в глаза, это done & 01 02 03 04. ты биты проверять должен а не цифры, поэтому 01 02 04 08спасибо. Я даже сомневался, нужно было узнать, с чем это я done сравниваю. Вообще, если быстро не найдется ошибка, то покс. Придумаю, как сдать, если что я не буду ничего говорить, cpp выглядит страшновато, может это твой код конечно но вот что я знаю точно, если тинплз скинет тебе работающее решение, то ты больше сюда не вернешься...это грустно, хочется, конечно, все понимать. Если хотя бы не уметь прогать, то хотя бы понимать, хоть часть. А вообще, C и C++ не мое, слишком тяжело там все Изменено 3 июня 2015 пользователем IOMOPHOu Поделиться сообщением Ссылка на сообщение
Двапой #9434 3 июня 2015 ну я реальной причины не знаю, куда люди пропадают, но такое было не раз Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
nobodies #9435 3 июня 2015 (изменено) обосыте, но не бейте, ибо вопрос вообще тупойнаписал в матлабе функцию построения графика по уравнению, все норм, только хз как квадратный корень в 3ю степень поставить, и гугл не помог ну и как размер шрифта увеличить в R2014 но это уже просто сам нихуя не вижу Изменено 3 июня 2015 пользователем nobodies Поделиться сообщением Ссылка на сообщение
Двапой #9436 3 июня 2015 x^(3/2) Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
nobodies #9437 3 июня 2015 x^(3/2)по другому никак? надеялся на команду ну ладн Поделиться сообщением Ссылка на сообщение
prostoYaKrytoy #9438 3 июня 2015 я не буду ничего говорить, cpp выглядит страшновато, может это твой код конечно но вот что я знаю точно, если тинплз скинет тебе работающее решение, то ты больше сюда не вернешься...ЖЗНна первом курсе он помог мнеи мой препод такой говорит: а я чёт не могу понять этот код, я не мог дать такое задание Поделиться сообщением Ссылка на сообщение
Двапой #9439 3 июня 2015 x^(3/2)по другому никак? надеялся на команду ну ладнне знаюpow(sqrt(x), 3) так как-то Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
Tinplz #9440 3 июня 2015 x^(3/2)по другому никак? надеялся на команду ну ладнБоюсь даже предположить зачем тебе по-другому. я не буду ничего говорить, cpp выглядит страшновато, может это твой код конечно но вот что я знаю точно, если тинплз скинет тебе работающее решение, то ты больше сюда не вернешься...ЖЗНна первом курсе он помог мнеи мой препод такой говорит: а я чёт не могу понять этот код, я не мог дать такое задание Ну да, а зачем писать кучу строк, если можно в 10-20 решить большинство универских задач по с++Ты же попросил на С++ а не на С :)А это немного разные вещи. Поделиться сообщением Ссылка на сообщение