Size: a a a

2021 February 24

DK

David Kravets in supapro.cxx
Stepan
А почему хочется избавиться от указанного метода взаимодействия?
Ну я в С , они а С++
источник

ПК

Побитый Кирпич... in supapro.cxx
David Kravets
Ну я в С , они а С++
Кто С++?
источник

DK

David Kravets in supapro.cxx
#include <sys/types.h>
#include <sys/ips.h>
#include <sys/msg.h>

#define MSQ_ID   2001     /* уникальный ключ очереди */
#define PERMS    00666    /* права доступа - все могут
                            читать и писать */
#define MSG_TYPE_STRING 1 /* тип сообщения о том, что
                            передана непустая строка */
#define MSG_TYPE_FINISH 2 /* тип сообщения о том, что
                            пора завершать обмен */
                         
#define MAX_STRING 120    /* максимальная длина строки */
         
typedef struct            /* структура сообщения */
{
 int type;
 char string [MAX_STRING];
}
message_t;
   Код программы-клиента:

#include <stdio.h>
#include <string.h>
#include "message.h"

void sys_err (char * msg)
{
 puts (msg);
 exit (1);
}

int main ()
{
 int msqid;      /* идентификатор очереди сообщений */
 message_t msg;  /* сообщение */
 char s [MAX_STRING];
 
 /* создание очереди */
 if ( (msqid = msgget (MSQ_ID, 0)) < 0)
   sys_err ("client:can not get msg queue");

 while (1) {
   scanf ("%s", s); /* ввод строки */
   if (strlen (s) != 1) {
     msg.type = MSG_TYPE_STRING;
     strncpy (msg.string, s, MAX_STRING);
   }
   else
   {
     msg.type = MSG_TYPE_FINISH;
   };
   /* посылка сообщения процессу-серверу */
   if (msgsnd (msqid, &msg, sizeof (message_t), 0) != 0)
     sys_err ("client: message send error");
   if (strlen (s) == 1) /* пустая строка - выход */
       break;
 }
     exit (0);
}
   Код программы-сервера:

#include <stdio.h>
#include <string.h>
#include "message.h"

void sys_err (char * msg)
{
 puts (msg);
 exit (1);
};

int main ()
{
 int msqid;
 message_t msg;
 char s [MAX_STRING];

 /* создание очереди сообщений */
 if ( (msqid = msgget (MSQ_ID, PERMS | IPC_CREAT) ) < 0)
   sys_err ("server: can not create msg queue");

 while (1) {
   /* получение очередного сообщения */
   if (msgrcv (msqid, &msg, sizeof (message_t), 0, 0) < 0)
     sys_err ("server: msg recive error");
     
   if (msg.type == MSG_TYPE_STRING) /* печать строки */
     printf ("%s", msg.string);

   if (msg.type == MSG_TYPE_FINISH) /* выход из цикла */
     break;
 }

 /* удаление очереди сообщений */
 if (msgctl (msqid, IPC_RMID, (struct msqid_ds *) 0) < 0)
   sys_err ("server: msq queue remove error");

 exit (0);
}
источник

C

CodeDetector in supapro.cxx
David Kravets
#include <sys/types.h>
#include <sys/ips.h>
#include <sys/msg.h>

#define MSQ_ID   2001     /* уникальный ключ очереди */
#define PERMS    00666    /* права доступа - все могут
                            читать и писать */
#define MSG_TYPE_STRING 1 /* тип сообщения о том, что
                            передана непустая строка */
#define MSG_TYPE_FINISH 2 /* тип сообщения о том, что
                            пора завершать обмен */
                         
#define MAX_STRING 120    /* максимальная длина строки */
         
typedef struct            /* структура сообщения */
{
 int type;
 char string [MAX_STRING];
}
message_t;
   Код программы-клиента:

#include <stdio.h>
#include <string.h>
#include "message.h"

void sys_err (char * msg)
{
 puts (msg);
 exit (1);
}

int main ()
{
 int msqid;      /* идентификатор очереди сообщений */
 message_t msg;  /* сообщение */
 char s [MAX_STRING];
 
 /* создание очереди */
 if ( (msqid = msgget (MSQ_ID, 0)) < 0)
   sys_err ("client:can not get msg queue");

 while (1) {
   scanf ("%s", s); /* ввод строки */
   if (strlen (s) != 1) {
     msg.type = MSG_TYPE_STRING;
     strncpy (msg.string, s, MAX_STRING);
   }
   else
   {
     msg.type = MSG_TYPE_FINISH;
   };
   /* посылка сообщения процессу-серверу */
   if (msgsnd (msqid, &msg, sizeof (message_t), 0) != 0)
     sys_err ("client: message send error");
   if (strlen (s) == 1) /* пустая строка - выход */
       break;
 }
     exit (0);
}
   Код программы-сервера:

#include <stdio.h>
#include <string.h>
#include "message.h"

void sys_err (char * msg)
{
 puts (msg);
 exit (1);
};

int main ()
{
 int msqid;
 message_t msg;
 char s [MAX_STRING];

 /* создание очереди сообщений */
 if ( (msqid = msgget (MSQ_ID, PERMS | IPC_CREAT) ) < 0)
   sys_err ("server: can not create msg queue");

 while (1) {
   /* получение очередного сообщения */
   if (msgrcv (msqid, &msg, sizeof (message_t), 0, 0) < 0)
     sys_err ("server: msg recive error");
     
   if (msg.type == MSG_TYPE_STRING) /* печать строки */
     printf ("%s", msg.string);

   if (msg.type == MSG_TYPE_FINISH) /* выход из цикла */
     break;
 }

 /* удаление очереди сообщений */
 if (msgctl (msqid, IPC_RMID, (struct msqid_ds *) 0) < 0)
   sys_err ("server: msq queue remove error");

 exit (0);
}
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
источник

ПК

Побитый Кирпич... in supapro.cxx
David Kravets
#include <sys/types.h>
#include <sys/ips.h>
#include <sys/msg.h>

#define MSQ_ID   2001     /* уникальный ключ очереди */
#define PERMS    00666    /* права доступа - все могут
                            читать и писать */
#define MSG_TYPE_STRING 1 /* тип сообщения о том, что
                            передана непустая строка */
#define MSG_TYPE_FINISH 2 /* тип сообщения о том, что
                            пора завершать обмен */
                         
#define MAX_STRING 120    /* максимальная длина строки */
         
typedef struct            /* структура сообщения */
{
 int type;
 char string [MAX_STRING];
}
message_t;
   Код программы-клиента:

#include <stdio.h>
#include <string.h>
#include "message.h"

void sys_err (char * msg)
{
 puts (msg);
 exit (1);
}

int main ()
{
 int msqid;      /* идентификатор очереди сообщений */
 message_t msg;  /* сообщение */
 char s [MAX_STRING];
 
 /* создание очереди */
 if ( (msqid = msgget (MSQ_ID, 0)) < 0)
   sys_err ("client:can not get msg queue");

 while (1) {
   scanf ("%s", s); /* ввод строки */
   if (strlen (s) != 1) {
     msg.type = MSG_TYPE_STRING;
     strncpy (msg.string, s, MAX_STRING);
   }
   else
   {
     msg.type = MSG_TYPE_FINISH;
   };
   /* посылка сообщения процессу-серверу */
   if (msgsnd (msqid, &msg, sizeof (message_t), 0) != 0)
     sys_err ("client: message send error");
   if (strlen (s) == 1) /* пустая строка - выход */
       break;
 }
     exit (0);
}
   Код программы-сервера:

#include <stdio.h>
#include <string.h>
#include "message.h"

void sys_err (char * msg)
{
 puts (msg);
 exit (1);
};

int main ()
{
 int msqid;
 message_t msg;
 char s [MAX_STRING];

 /* создание очереди сообщений */
 if ( (msqid = msgget (MSQ_ID, PERMS | IPC_CREAT) ) < 0)
   sys_err ("server: can not create msg queue");

 while (1) {
   /* получение очередного сообщения */
   if (msgrcv (msqid, &msg, sizeof (message_t), 0, 0) < 0)
     sys_err ("server: msg recive error");
     
   if (msg.type == MSG_TYPE_STRING) /* печать строки */
     printf ("%s", msg.string);

   if (msg.type == MSG_TYPE_FINISH) /* выход из цикла */
     break;
 }

 /* удаление очереди сообщений */
 if (msgctl (msqid, IPC_RMID, (struct msqid_ds *) 0) < 0)
   sys_err ("server: msq queue remove error");

 exit (0);
}
Это  не С++
источник

DK

David Kravets in supapro.cxx
Что такое написал тяжело ещё
источник

DK

David Kravets in supapro.cxx
Побитый Кирпич
Это  не С++
Ну я и написал что С
источник

s

std::slavik in supapro.cxx
а как можно по указателю  узнать имя функции?
делаю мемори трейсер, обернул malloc, в лог вываливается типа такого, где второе число - const void *caller
#f:0x0;0x804d409-0x2000e698
#m:0x2000e6d0;0x804c89d-32
теперь нужно по этим адресам человеческие имена функций вытащить - как лучше сделать?
источник

D

Dmitriy in supapro.cxx
std::slavik
а как можно по указателю  узнать имя функции?
делаю мемори трейсер, обернул malloc, в лог вываливается типа такого, где второе число - const void *caller
#f:0x0;0x804d409-0x2000e698
#m:0x2000e6d0;0x804c89d-32
теперь нужно по этим адресам человеческие имена функций вытащить - как лучше сделать?
WinDbg + команда u?
источник

s

std::slavik in supapro.cxx
Dmitriy
WinDbg + команда u?
не под винду
источник

D

Dmitriy in supapro.cxx
Ой, не Win , а что у вас там на Лине
источник

s

std::slavik in supapro.cxx
и не под линукс)
источник

s

std::slavik in supapro.cxx
ну типа там - через препроцессор может или как то компилятор попросить чето сделать
источник

s

std::slavik in supapro.cxx
отладочные символы там поковырять
источник

s

std::slavik in supapro.cxx
первый раз просто таким руками занимаюсь, не хочу колхозить лишний раз если готовое уже решение есть
источник

s

std::slavik in supapro.cxx
есть .map файл в выходе компилятора
.text._ZN4mbed21mbed_override_consoleEi
               0x08071130       0x80 BUILD/NUCLEO_F767ZI/GCC_ARM-RELEASE/src/main.o
               0x08071130                mbed::mbed_override_console(int)
.text.startup._GLOBAL__sub_I___sync_synchronize
               0x080711b0      0x158 BUILD/NUCLEO_F767ZI/GCC_ARM-RELEASE/src/main.o
.text.startup.main
               0x08071308      0x514 BUILD/NUCLEO_F767ZI/GCC_ARM-RELEASE/src/main.o
               0x08071308                main
источник

C

Chuvi in supapro.cxx
std::slavik
есть .map файл в выходе компилятора
.text._ZN4mbed21mbed_override_consoleEi
               0x08071130       0x80 BUILD/NUCLEO_F767ZI/GCC_ARM-RELEASE/src/main.o
               0x08071130                mbed::mbed_override_console(int)
.text.startup._GLOBAL__sub_I___sync_synchronize
               0x080711b0      0x158 BUILD/NUCLEO_F767ZI/GCC_ARM-RELEASE/src/main.o
.text.startup.main
               0x08071308      0x514 BUILD/NUCLEO_F767ZI/GCC_ARM-RELEASE/src/main.o
               0x08071308                main
ida pro +dwarf?)
источник

s

std::slavik in supapro.cxx
пока что думаю этот файл распарсить - разбить по интервалам адресов соответствующие функции и искать в какой диапазон  адрес возврата попадает
источник

C

Chuvi in supapro.cxx
std::slavik
пока что думаю этот файл распарсить - разбить по интервалам адресов соответствующие функции и искать в какой диапазон  адрес возврата попадает
попробуй кстати попросить gcc-ху помимо всего прочего выдавать ассемблерный листинг. Или компилил не ты?
источник

s

std::slavik in supapro.cxx
Chuvi
попробуй кстати попросить gcc-ху помимо всего прочего выдавать ассемблерный листинг. Или компилил не ты?
я компилил, зачем мне ассемблер если есть мапа
источник