DeadMage #9441 3 июня 2015 (изменено) Держи #include <unistd.h> #include <memory.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" }; char* path = "./data"; int id = 1; void parent_proc(int msgid) { //Функция родительского процесса mesg message; key_t key; int len, cur; int done = 0; //Показатель окончания передачи данных процессом message.mtype = 5L; //Тип сообщения 3 необходим для инициализации message.buff[0] = 0; //дочерних процессов. Отправляются два таких msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); //сообщения со значениями первого message.buff[0] = 1; //байта 0, 1, 2 или 3 msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); message.buff[0] = 2; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); message.buff[0] = 3; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); for (cur = 0; ; cur = (cur + 1) % 4) { len = msgrcv(msgid, &message, sizeof(message)-sizeof(long), cur+1, 0); if (message.buff[0] == 0) { //Если это пустая msgctl(msgid, IPC_RMID, 0); //завершаем работу return; } else write(1, message.buff, strlen(message.buff)); //иначе выводим строку } } void child_proc(void) { mesg message; key_t key; int msgid, whoami, str, len, ret; key = ftok(path, id); //Получение ключа msgid = msgget(key, 0); //Открытие очереди сообщений ret = msgrcv(msgid, &message, sizeof(message)-sizeof(long), 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, sizeof(message)-sizeof(long), 0); //Отправление сообщения } } message.buff[0] = 0; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); //Отправление сообщения о завершении return; } int main() { int key = ftok(path, id); //Получение ключа int msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений 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(msgid); return 0; } 1) Надо надо передавать только длину твоих данных в сообщении (без msgid)2) Надо сначала создать очередь перед тем как её использовать Изменено 3 июня 2015 пользователем DeadMage Поделиться сообщением Ссылка на сообщение
suez #9442 3 июня 2015 В оффтопе вызывают дьявола http://codepen.io/suez/ - they see me bydlocoding, they hatin. Поделиться сообщением Ссылка на сообщение
rubish #9443 3 июня 2015 ну так пишут только мудаки, но с другой стороны лабы в универе только так и пишут Колы я выросту - то хочу буты такым як я годные смайлы Поделиться сообщением Ссылка на сообщение
DeadMage #9444 3 июня 2015 Ну не буду же я ему еще и все переписывать Поделиться сообщением Ссылка на сообщение
rubish #9445 3 июня 2015 Ну не буду же я ему еще и все переписывать правильно. тинплз переписыванием уже не мало людей в армию отправил Колы я выросту - то хочу буты такым як я годные смайлы Поделиться сообщением Ссылка на сообщение
Двапой #9446 3 июня 2015 а либа для mapreduce в плюсах есть?можно было на ней сделать, чтобы все охуели как ты можешь Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
Tinplz #9447 3 июня 2015 Ну не буду же я ему еще и все переписывать правильно. тинплз переписыванием уже не мало людей в армию отправилНу вот один показался уже, может все остальные там же обитаюта либа для mapreduce в плюсах есть?можно было на ней сделать, чтобы все охуели как ты можешьесть какие-то офкно тут ему больше бы boost::interprocess подошелно его препод бы точно тогда с говном съел Поделиться сообщением Ссылка на сообщение
Двапой #9448 3 июня 2015 помню у нас какие-то лабы со строками были на питонея в одну строку с помощью регулярки и лямбды сделалсказали переделывать, с тех пор на лабы я не ходил (на английский ходил, препод няша была) но это справедливо на самом деле, я действительно выебнулсяи сделал бы так же и сейчас Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
rubish #9449 3 июня 2015 помню у нас какие-то лабы со строками были на питонея в одну строку с помощью регулярки и лямбды сделалсказали переделывать, с тех пор на лабы я не ходил (на английский ходил, препод няша была) но это справедливо на самом деле, я действительно выебнулсяи сделал бы так же и сейчасну лабы же с какой-то целью делаются. есть какая-то проблема и ты (конкретно ТЫ) ее решаешь. вместо этого ты даешь уже готовое решение (не твое) и такой: поклоняйтесь мне, я умею пользоваться готовыми решениями Колы я выросту - то хочу буты такым як я годные смайлы Поделиться сообщением Ссылка на сообщение
Двапой #9450 3 июня 2015 ну понятно, что даются с какой-то целью, в частности там была работа с циклами, проверками, все такоето есть какой-то примитив а поскольку я знал более красивое и быстрое решение, я написал егоя от этого даже выиграл, быстрее вошел в рынок и больше опыта в итоге получил хотя, конечно, может я что-то в универе и выучил бы, но зато уже есть большуший опыт, включая нагруженные проекты, а такой опыт с неба не падает Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
Tinplz #9451 3 июня 2015 Норм, с первого универе меня выгнали из-за программирования, на ПЗ тетка сказала что я профнепригоден Поделиться сообщением Ссылка на сообщение
Двапой #9452 3 июня 2015 то как делать лабы это палка о двух концахс одной стороны ты можешь делать все правильно, как тебя учили, и с помощью той темы которую вы прошли с этом случае даже два варианта, ты можешь делать все хорошо, комментировать код, где надо, писать адекватные названия перменных, сразу делить все на функции и так далее, это хороший вариант, потому что приучиваешься к хорошему коду, но учишься делать вещи не слишком рационально (зависит от лаб, конечно), во-втором варианте, ты можешь тоже сделать все по теме, но код написать от балды, а чаще всего, скопировать у одногруппника и переделать, забывая про отсуты и все насвете - это самый хуевый вариант, из такого человака вряд ли выйдет хороший программист с другой стороны, ты можешь поступать как я, и налаживать отношение с преподом, которая понимала бы, что ты и без того умеешь (а она знала, потому что я в олимпиде победил), только все равно оказалась принципиальной, а мне было тупо лень писать как надо я не говорю, что я такой крутой и все правильно делал, вовсе нет, я делал это так, потому что мне было просто похуй Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
prostoYaKrytoy #9453 3 июня 2015 http://prodota.ru/forum/index.php?showtopic=161157&st=20#entry9747623 Поделиться сообщением Ссылка на сообщение
Двапой #9454 3 июня 2015 лол, там на след. странице мои похождения как я джаву перед новым годом учил Так что мораль - все когда-то были хуевыми говнокодерами, но каждый имеет возможность доучится на практике до уважаемого (на продоте) человека с зарплатой в долларах Мобильное приложение для продоты https://play.google....id=ru.prodota.m Поделиться сообщением Ссылка на сообщение
rubish #9455 3 июня 2015 а поскольку я знал более красивое и быстрое решение, я написал егорофел :) ну правильное решение для тебя в таком случае было забрать документы то как делать лабы это палка о двух концахс одной стороны ты можешь делать все правильно, как тебя учили, и с помощью той темы которую вы прошли с этом случае даже два варианта, ты можешь делать все хорошо, комментировать код, где надо, писать адекватные названия перменных, сразу делить все на функции и так далее, это хороший вариант, потому что приучиваешься к хорошему коду, но учишься делать вещи не слишком рационально (зависит от лаб, конечно), во-втором варианте, ты можешь тоже сделать все по теме, но код написать от балды, а чаще всего, скопировать у одногруппника и переделать, забывая про отсуты и все насвете - это самый хуевый вариант, из такого человака вряд ли выйдет хороший программист с другой стороны, ты можешь поступать как я, и налаживать отношение с преподом, которая понимала бы, что ты и без того умеешь (а она знала, потому что я в олимпиде победил), только все равно оказалась принципиальной, а мне было тупо лень писать как надо я не говорю, что я такой крутой и все правильно делал, вовсе нет, я делал это так, потому что мне было просто похуйну это напоминает рассуждение моей знакомой, о том, что ее младшего брата не так обучают теорверу. какие-то задачи тупорылые, оторванные от реальности, так много внимания теоремам.в целом вузы (все вузы) предполагают, что ты в идеале ученым станешь. это не бурса, где тебя учат быть винтиком в механизме, а универ, где хотят чтобы ты такие системы создавал. насчет комментариев к коду - то это самый плохой симптом. если ты комментируешь свой код - значит, что он непонятен сам по себе (хуевый) и должен быть переписан Колы я выросту - то хочу буты такым як я годные смайлы Поделиться сообщением Ссылка на сообщение
IOMOPHOu #9456 3 июня 2015 Держи #include <unistd.h> #include <memory.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" }; char* path = "./data"; int id = 1; void parent_proc(int msgid) { //Функция родительского процесса mesg message; key_t key; int len, cur; int done = 0; //Показатель окончания передачи данных процессом message.mtype = 5L; //Тип сообщения 3 необходим для инициализации message.buff[0] = 0; //дочерних процессов. Отправляются два таких msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); //сообщения со значениями первого message.buff[0] = 1; //байта 0, 1, 2 или 3 msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); message.buff[0] = 2; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); message.buff[0] = 3; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); for (cur = 0; ; cur = (cur + 1) % 4) { len = msgrcv(msgid, &message, sizeof(message)-sizeof(long), cur+1, 0); if (message.buff[0] == 0) { //Если это пустая msgctl(msgid, IPC_RMID, 0); //завершаем работу return; } else write(1, message.buff, strlen(message.buff)); //иначе выводим строку } } void child_proc(void) { mesg message; key_t key; int msgid, whoami, str, len, ret; key = ftok(path, id); //Получение ключа msgid = msgget(key, 0); //Открытие очереди сообщений ret = msgrcv(msgid, &message, sizeof(message)-sizeof(long), 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, sizeof(message)-sizeof(long), 0); //Отправление сообщения } } message.buff[0] = 0; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); //Отправление сообщения о завершении return; } int main() { int key = ftok(path, id); //Получение ключа int msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений 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(msgid); return 0; } 1) Надо надо передавать только длину твоих данных в сообщении (без msgid)2) Надо сначала создать очередь перед тем как её использоватьчто значит строчка sizeof(message)-sizeof(long)? я из джавы, поэтому для меня это выглядит, как от числа отнимается результат непонятно какой функции, потому что переменной long выше нет, да и long это зарезервированное слово. Это какой-то способ приведения типов?Хотя вот посмотрел, в C# это Позволяет получить размер в байтах для неуправляемого типа. К неуправляемым типам относятся встроенные типы, перечисленные в представленной ниже таблице, а также следующие типы:Перечисляемые типыТипы указателейОпределяемые пользователем структуры, не содержащие полей или свойств, принадлежащих ссылочным типам только возвращает такой метод 8 байт, зачем? В принципе, это риторический вопрос, прост)))00 интересноТаааак: и еще два риторических: насчет 2) а почему тогда все работало в другой лабе? там в родительском процессе отдельно создавалась очередьнасчет 1) не понял, это есть результат sizeof(message)-sizeof(long)?а так все работает, огромное спасибо. Хотя я уже собирался сдавать методом:gcc lab.cи вместо ./a.out написать ./a/a.out препод не заметила бы Поделиться сообщением Ссылка на сообщение
rubish #9457 3 июня 2015 (изменено) Держи #include <unistd.h> #include <memory.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" }; char* path = "./data"; int id = 1; void parent_proc(int msgid) { //Функция родительского процесса mesg message; key_t key; int len, cur; int done = 0; //Показатель окончания передачи данных процессом message.mtype = 5L; //Тип сообщения 3 необходим для инициализации message.buff[0] = 0; //дочерних процессов. Отправляются два таких msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); //сообщения со значениями первого message.buff[0] = 1; //байта 0, 1, 2 или 3 msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); message.buff[0] = 2; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); message.buff[0] = 3; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); for (cur = 0; ; cur = (cur + 1) % 4) { len = msgrcv(msgid, &message, sizeof(message)-sizeof(long), cur+1, 0); if (message.buff[0] == 0) { //Если это пустая msgctl(msgid, IPC_RMID, 0); //завершаем работу return; } else write(1, message.buff, strlen(message.buff)); //иначе выводим строку } } void child_proc(void) { mesg message; key_t key; int msgid, whoami, str, len, ret; key = ftok(path, id); //Получение ключа msgid = msgget(key, 0); //Открытие очереди сообщений ret = msgrcv(msgid, &message, sizeof(message)-sizeof(long), 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, sizeof(message)-sizeof(long), 0); //Отправление сообщения } } message.buff[0] = 0; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); //Отправление сообщения о завершении return; } int main() { int key = ftok(path, id); //Получение ключа int msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений 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(msgid); return 0; } 1) Надо надо передавать только длину твоих данных в сообщении (без msgid)2) Надо сначала создать очередь перед тем как её использоватьчто значит строчка sizeof(message)-sizeof(long)? я из джавы, поэтому для меня это выглядит, как от числа отнимается результат непонятно какой функции, потому что переменной long выше нет, да и long это зарезервированное слово. Это какой-то способ приведения типов?Хотя вот посмотрел, в C# это Позволяет получить размер в байтах для неуправляемого типа. К неуправляемым типам относятся встроенные типы, перечисленные в представленной ниже таблице, а также следующие типы:Перечисляемые типыТипы указателейОпределяемые пользователем структуры, не содержащие полей или свойств, принадлежащих ссылочным типам только возвращает такой метод 8 байт, зачем? В принципе, это риторический вопрос, прост)))00 интересноТаааак: и еще два риторических: насчет 2) а почему тогда все работало в другой лабе? там в родительском процессе отдельно создавалась очередьнасчет 1) не понял, это есть результат sizeof(message)-sizeof(long)?а так все работает, огромное спасибо. Хотя я уже собирался сдавать методом:gcc lab.cи вместо ./a.out написать ./a/a.out препод не заметила бырофел :) никогда не интересовало что значит управляемый? что такое ссылочные и значимые типы. стек там, куча. почему в жаве и шарпе куча управляемая, а в с++ нет. что такое сборщик мусора. как вообще всё работает? Изменено 3 июня 2015 пользователем rubish Колы я выросту - то хочу буты такым як я годные смайлы Поделиться сообщением Ссылка на сообщение
IOMOPHOu #9458 3 июня 2015 (изменено) Держи #include <unistd.h> #include <memory.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" }; char* path = "./data"; int id = 1; void parent_proc(int msgid) { //Функция родительского процесса mesg message; key_t key; int len, cur; int done = 0; //Показатель окончания передачи данных процессом message.mtype = 5L; //Тип сообщения 3 необходим для инициализации message.buff[0] = 0; //дочерних процессов. Отправляются два таких msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); //сообщения со значениями первого message.buff[0] = 1; //байта 0, 1, 2 или 3 msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); message.buff[0] = 2; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); message.buff[0] = 3; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); for (cur = 0; ; cur = (cur + 1) % 4) { len = msgrcv(msgid, &message, sizeof(message)-sizeof(long), cur+1, 0); if (message.buff[0] == 0) { //Если это пустая msgctl(msgid, IPC_RMID, 0); //завершаем работу return; } else write(1, message.buff, strlen(message.buff)); //иначе выводим строку } } void child_proc(void) { mesg message; key_t key; int msgid, whoami, str, len, ret; key = ftok(path, id); //Получение ключа msgid = msgget(key, 0); //Открытие очереди сообщений ret = msgrcv(msgid, &message, sizeof(message)-sizeof(long), 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, sizeof(message)-sizeof(long), 0); //Отправление сообщения } } message.buff[0] = 0; msgsnd(msgid, &message, sizeof(message)-sizeof(long), 0); //Отправление сообщения о завершении return; } int main() { int key = ftok(path, id); //Получение ключа int msgid = msgget(key, 0666 | IPC_CREAT); //Создание очереди сообщений 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(msgid); return 0; } 1) Надо надо передавать только длину твоих данных в сообщении (без msgid)2) Надо сначала создать очередь перед тем как её использоватьчто значит строчка sizeof(message)-sizeof(long)? я из джавы, поэтому для меня это выглядит, как от числа отнимается результат непонятно какой функции, потому что переменной long выше нет, да и long это зарезервированное слово. Это какой-то способ приведения типов?Хотя вот посмотрел, в C# это Позволяет получить размер в байтах для неуправляемого типа. К неуправляемым типам относятся встроенные типы, перечисленные в представленной ниже таблице, а также следующие типы:Перечисляемые типыТипы указателейОпределяемые пользователем структуры, не содержащие полей или свойств, принадлежащих ссылочным типам только возвращает такой метод 8 байт, зачем? В принципе, это риторический вопрос, прост)))00 интересноТаааак: и еще два риторических: насчет 2) а почему тогда все работало в другой лабе? там в родительском процессе отдельно создавалась очередьнасчет 1) не понял, это есть результат sizeof(message)-sizeof(long)?а так все работает, огромное спасибо. Хотя я уже собирался сдавать методом:gcc lab.cи вместо ./a.out написать ./a/a.out препод не заметила бырофел :) никогда не интересовало что значит управляемый? что такое ссылочные и значимые типы. стек там, куча. почему в жаве и шарпе куча управляемая, а в с++ нет. что такое сборщик мусора. как вообще всё работает?знаю что такое стек, что такое куча представляю, на куче писал пирамидальную сортировку(а точнее разбирал чужой код, чтобы не придумывать велосипед), представляю, что значит ссылочный тип, про значимый не слышал ничего (ща немношк нагуглил). Что такое сборщик мусора оооочень в общем виде представляю, ну или чуть поглубже, просто я сейчас на уровне "gc сделает все за тебя", а так, много раз пытался разобраться, каждый раз углублялся, но все равно довольно сложно понять как именно подробно работает сборщик мусора.Но это не отменяет вопроса. Как мы от размера структуры отнимаем непонятно что? но я даже погуглив не понял, что такое sizeof(long). Или понял и это равно 8. Но зачем мы так отнимаем и почему в других примерах сё работало - не знай а, ну все. Сеньки. По идее надо когда-нибудь выучить C и C++(за 21 день офк) Изменено 3 июня 2015 пользователем IOMOPHOu Поделиться сообщением Ссылка на сообщение
DeadMage #9459 3 июня 2015 (изменено) что значит строчка sizeof(message)-sizeof(long)? я из джавы, поэтому для меня это выглядит, как от числа отнимается результат непонятно какой функции, потому что переменной long выше нет, да и long это зарезервированное слово. Это какой-то способ приведения типов?Хотя вот посмотрел, в C# это Позволяет получить размер в байтах для неуправляемого типа. К неуправляемым типам относятся встроенные типы, перечисленные в представленной ниже таблице, а также следующие типы:Перечисляемые типыТипы указателейОпределяемые пользователем структуры, не содержащие полей или свойств, принадлежащих ссылочным типам только возвращает такой метод 8 байт, зачем? В принципе, это риторический вопрос, прост)))00 интересноТаааак: и еще два риторических: насчет 2) а почему тогда все работало в другой лабе? там в родительском процессе отдельно создавалась очередьнасчет 1) не понял, это есть результат sizeof(message)-sizeof(long)?а так все работает, огромное спасибо. Хотя я уже собирался сдавать методом:gcc lab.cи вместо ./a.out написать ./a/a.out препод не заметила быНу надо посчитать размер твоих данных в сообщении. sizeof считает размер структуры/нативного типа, sizeof(message)-sizeof(long) == размеру твоих данных в сообщение (без айдишника).Насчет 2) ты форкаешься до того как создаешь очередь => первый msgrcv в чайлде (если он выполнится до создания очереди) вернет ошибку что очереди нет => в mesg.buffer[0] рандомная хуйня => whoami = рандомной хуйне => шлем месседж с левым id У меня это не работало, если работало у тебя то по счастливой случайности =) Надеюсь понятно объяснил. Я кстати до магистра седня апнулся Изменено 3 июня 2015 пользователем DeadMage Поделиться сообщением Ссылка на сообщение
Tinplz #9460 3 июня 2015 юзлесс хуета все эти магистры.занятие для того чтобы устроить свою жизнь нищеброда Поделиться сообщением Ссылка на сообщение