Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > куда в ubuntu дели поля msg_first/last из msqid_ds


Автор: abskura 13.9.2010, 18:14
проблема такая, в заголовочном файле /sys/msg.h в FreBSD 8.0 содержится, по мимо прочего, информация о структуре msqid_ds, и выглядит эта структура следующим образом:
Код

 struct msqid_ds {
    struct ipc_perm    msg_perm;       /* opйration permission struct */
    struct __msg       *msg_first;     /* ptr to first message on q */
    struct __msg       *msg_last;      /* ptr to last message on q */
    msgqnum_t msg_qnum;       /* # of messages on q */
    msglen_t msg_qbytes;     /* max # of bytes on q */
    msglen_t msg_cbytes   /* # of bytes in use on the queue */
    pid_t              msg_lspid;      /* pid of last msgsnd */
    pid_t              msg_lrpid;      /* pid of last msgrcv */
    time_t             msg_stime;      /* last msgsnd time */
    time_t             msg_rtime;      /* last msgrcv time */
    time_t             msg_ctime;      /* last change time */
   };


Этаже структура в Ubuntu 10.04 определена в заголовочном файле /bits/msq.h и выглядит следующим образом:
Код

struct msqid_ds
{
  struct ipc_perm msg_perm;    /* structure describing operation permission */
  __time_t msg_stime;        /* time of last msgsnd command */
#if __WORDSIZE == 32
  unsigned long int __unused1;
#endif
  __time_t msg_rtime;        /* time of last msgrcv command */
#if __WORDSIZE == 32
  unsigned long int __unused2;
#endif
  __time_t msg_ctime;        /* time of last change */
#if __WORDSIZE == 32
  unsigned long int __unused3;
#endif
  unsigned long int __msg_cbytes; /* current number of bytes on queue */
  msgqnum_t msg_qnum;        /* number of messages currently on queue */
  msglen_t msg_qbytes;        /* max number of bytes allowed on queue */
  __pid_t msg_lspid;        /* pid of last msgsnd() */
  __pid_t msg_lrpid;        /* pid of last msgrcv() */
  unsigned long int __unused4;
  unsigned long int __unused5;
};

 
нет полей *msg_first и *msg_last, которые указывают на первое и последенее сообщение в очереди, соответственно, точнее на информацию о них, которая хранится в структуре strut msg
Код

struct msg
{
   struct msg *msg_next;
   long msg_type;
   char *msg_spot;
   short msg_ts;
};


Из которой мне нужно значение msg_ts, в нем содержится размер текста конкретного сообщения. 

Вопрос: как быть-то? Ответ "компилировать в FreBSD", - не предлогать, суть в том, что бы программа компилилась и в  Ubuntu  и в FreBSD.

Автор: boostcoder 13.9.2010, 19:05
все правильно. фря это не линукс. и на оборот.
в доке сказано, что в линукс, эта структура, должна содержать как минимум следующие поля:
Код

struct msqid_ds {
   struct ipc_perm msg_perm;
   msgqnum_t msg_qnum;
   msglen_t msg_qbytes;
   pid_t msg_lspid;
   pid_t msg_lrpid;
   time_t msg_stime;
   time_t msg_rtime;
   time_t msg_ctime;
};

остальное по желанию.

Автор: abskura 13.9.2010, 19:15
Цитата(boostcoder @ 13.9.2010,  19:05)
остальное по желанию.

Эм, а можно чуть подробнее, как вот это мое желание осуществить? Как в эту структуру добавить нужное поле? Не править же на каждом компьютере заголовочный файл.
Или иначе, где в линуксе взять нужное мне значение msg_ts? Сам я что-то не врублюсь.

UPD: ну или как иначе можно определить размер конкретного сообщения в очереди сообщений? Может есть у кого мысли?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)