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

Hed-kun

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

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

(изменено)

Держи

 

#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) Надо сначала создать очередь перед тем как её использовать


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

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


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

В оффтопе вызывают дьявола


userbar-53933.png

http://codepen.io/suez/ - they see me bydlocoding, they hatin.

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


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

ну так пишут только мудаки, но с другой стороны лабы в универе только так и пишут


Колы я выросту - то хочу буты такым як я

5c8bbc85b99e.gif

 

годные смайлы

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


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

Ну не буду же я ему еще и все переписывать :hmm:

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


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

Ну не буду же я ему еще и все переписывать :hmm:

правильно. тинплз переписыванием уже не мало людей в армию отправил

Колы я выросту - то хочу буты такым як я

5c8bbc85b99e.gif

 

годные смайлы

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


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

а либа для mapreduce в плюсах есть?

можно было на ней сделать, чтобы все охуели как ты можешь


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

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


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

Ну не буду же я ему еще и все переписывать :hmm:

правильно. тинплз переписыванием уже не мало людей в армию отправил

Ну вот один показался уже, может все остальные там же обитают

а либа для mapreduce в плюсах есть?

можно было на ней сделать, чтобы все охуели как ты можешь

есть какие-то офк

но тут ему больше бы boost::interprocess подошел

но его препод бы точно тогда с говном съел

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


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

помню у нас какие-то лабы со строками были на питоне

я в одну строку с помощью регулярки и лямбды сделал

сказали переделывать, с тех пор на лабы я не ходил (на английский ходил, препод няша была)

 

но это справедливо на самом деле, я действительно выебнулся

и сделал бы так же и сейчас


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

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


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

помню у нас какие-то лабы со строками были на питоне

я в одну строку с помощью регулярки и лямбды сделал

сказали переделывать, с тех пор на лабы я не ходил (на английский ходил, препод няша была)

 

но это справедливо на самом деле, я действительно выебнулся

и сделал бы так же и сейчас

ну лабы же с какой-то целью делаются. есть какая-то проблема и ты (конкретно ТЫ) ее решаешь. вместо этого ты даешь уже готовое решение (не твое) и такой: поклоняйтесь мне, я умею пользоваться готовыми решениями

Колы я выросту - то хочу буты такым як я

5c8bbc85b99e.gif

 

годные смайлы

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


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

ну понятно, что даются с какой-то целью, в частности там была работа с циклами, проверками, все такое

то есть какой-то примитив

 

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

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

 

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


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

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


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

Норм, с первого универе меня выгнали из-за программирования, на ПЗ тетка сказала что я профнепригоден

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


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

то как делать лабы это палка о двух концах

с одной стороны ты можешь делать все правильно, как тебя учили, и с помощью той темы которую вы прошли

 

с этом случае даже два варианта, ты можешь делать все хорошо, комментировать код, где надо, писать адекватные названия перменных, сразу делить все на функции и так далее, это хороший вариант, потому что приучиваешься к хорошему коду, но учишься делать вещи не слишком рационально (зависит от лаб, конечно), во-втором варианте, ты можешь тоже сделать все по теме, но код написать от балды, а чаще всего, скопировать у одногруппника и переделать, забывая про отсуты и все насвете - это самый хуевый вариант, из такого человака вряд ли выйдет хороший программист

 

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

 

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


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

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


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

лол, там на след. странице мои похождения как я джаву перед новым годом учил :lol:

 

Так что мораль - все когда-то были хуевыми говнокодерами, но каждый имеет возможность доучится на практике до уважаемого (на продоте) человека с зарплатой в долларах


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

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


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

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

рофел :) ну правильное решение для тебя в таком случае было забрать документы

 

то как делать лабы это палка о двух концах

с одной стороны ты можешь делать все правильно, как тебя учили, и с помощью той темы которую вы прошли

 

с этом случае даже два варианта, ты можешь делать все хорошо, комментировать код, где надо, писать адекватные названия перменных, сразу делить все на функции и так далее, это хороший вариант, потому что приучиваешься к хорошему коду, но учишься делать вещи не слишком рационально (зависит от лаб, конечно), во-втором варианте, ты можешь тоже сделать все по теме, но код написать от балды, а чаще всего, скопировать у одногруппника и переделать, забывая про отсуты и все насвете - это самый хуевый вариант, из такого человака вряд ли выйдет хороший программист

 

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

 

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

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

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

 

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


Колы я выросту - то хочу буты такым як я

5c8bbc85b99e.gif

 

годные смайлы

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


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

Держи

 

#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 препод не заметила бы

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


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

Держи

 

#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

Колы я выросту - то хочу буты такым як я

5c8bbc85b99e.gif

 

годные смайлы

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


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

Держи

 

#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 день офк)


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

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


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

что значит строчка 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

 

У меня это не работало, если работало у тебя то по счастливой случайности =)

 

Надеюсь понятно объяснил.

 

Я кстати до магистра седня апнулся :buba::veselimsya:


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

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


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

юзлесс хуета все эти магистры.

занятие для того чтобы устроить свою жизнь нищеброда

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


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

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