nixp.ru v3.0

26 мая 2017,
пятница,
01:06:50 MSK

DevOps с компанией «Флант»
Uncle Theodore написал 21 февраля 2005 года в 01:30 (538 просмотров) Ведет себя неопределенно; открыл 58 тем в форуме, оставил 1537 комментариев на сайте.

Вот эта программа

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc, char **argv)
{
  key_t ipc_key;
  int mess_id;
  int i;
  struct mymsgbuf //user-defined structure for messages
  {
    long mtype;
    int mtext;
  } msg;
  //obtain a key
  if((ipc_key = ftok(".", 1)) == -1)
    {
      printf("Error key generating!\n");
      return -1;
    };
  //create a message queue
  if((mess_id = msgget(ipc_key, IPC_CREAT|0660)==-1))
    {
      printf("Unable to get a message queue!\n");
      return -1;
    };
        
  //fork a new process
  if(fork()) //parent
    {
      msg.mtype = 4; //parent sends message of type 4
      msg.mtext = getpid();
      if((msgsnd(mess_id, &msg, sizeof(int), 0))==-1)
      perror("PARENT: Writing to a message queue failed: ");
      for(i=0;i<5;i++)
      {
       if((msgrcv(mess_id, &msg, sizeof(int),2,0)) != -1)
        //parent waits for messages of type 2
         printf("PARENT: received a message from process %i\n", msg.mtext);
        msgsnd(mess_id, &msg, sizeof(int), 0);
      };
    }
  
  else //child
    {
      msg.mtype = 2; //child sends messages of type 2
      msg.mtext = getpid();
      if((msgsnd(mess_id, &msg, sizeof(int), 0))==-1)
      perror("CHILD: Writing to a message queue failed: ");
      for(i=0;i<5;i++)
      {
        if((msgrcv(mess_id, &msg, sizeof(int),4,0)) != -1)
        //child waits for messages of type 2
          printf("CHILD: received a message from process %i\n", msg.mtext);
        msgsnd(mess_id, &msg, sizeof(int), 0);
      };
    };
  wait(NULL);
  msgctl(mess_id, IPC_RMID, NULL);  //delete the message queue
  
  return 0;
};

выдает:

CHILD: Writing to a message queue failed: : Identifier removed

PARENT: Writing to a message queue failed: : Identifier removed

Причем, ipcs выдает, что у меня появляется message queue с каким-то номером, которую надо убивать. Спасите остатки волос у меня на голове, объясните, чтО происходит?!!1

Good Luck,

UT

ПЫ-СЫ: пытался создавать queues в процессах (отдельно для папки и сосунка). Результат — тот же. Какого волосатого этот identifier removed?!

Genie

символически подчистив текст (ммм.. «};» — сильнО)

$ cc -o msg msg.c
$ ./msg
PARENT: received a message from process 26980
PARENT: received a message from process 26980
PARENT: received a message from process 26980
PARENT: received a message from process 26980
PARENT: received a message from process 26980
CHILD: received a message from process 26979
CHILD: received a message from process 26979
CHILD: received a message from process 26979
CHILD: received a message from process 26979
CHILD: received a message from process 26979
Uncle Theodore

Не понял, как именно ты его почистил?!

Кстати, ты знаешь, у меня mplayer отказывается работать в shm моде. Говорит, апшипка… Я так думаю, надо бы перезапуститься, похоже, засрал я память чем-то неудобоваримым…

Good Luck,

UT

Genie
Не понял, как именно ты его почистил?!

trailing spaces поудалял

«;» апосля «}» тоже…

скомпилировал и запустил…

Кстати, ты знаешь, у меня mplayer отказывается работать в shm моде. Говорит, апшипка…

как именно это? ;)

ну, в смысле, как именно пускаешь и что именно оно тебе отвечает?

хотя, это надо в другой теме и другой ветке, я так думаю… ;)

Genie

кстати…

а вот повторный запуск выдаёт:

$ ./msg
CHILD: Writing to a message queue failed: : Identifier removed
PARENT: Writing to a message queue failed: : Identifier removed
Genie

видимо, на моменте создания/удаления происходит что-то не так:

если изменить немного код:

//...
   if((mess_id = msgget(ipc_key, IPC_CREAT|IPC_EXCL|0660)==-1))

то выполнение завершается с:

$ ./msg
Unable to get a message queue!

поэтому, что-то неправильно при создании или удалении очереди.

кстати, может её сделать для этого примера IPC_PRIVATE?

хотя, один фиг, теперь только перезагрузкой спасаться… :(

<font size=«-2»>добавлено позднее</font>

main() {
  struct msqid_ds buf;
//...
  //create a message queue
  if((mess_id = msgget(ipc_key, IPC_CREAT|0660)==-1))
    {
      printf("Unable to get a message queue!\n");
      return -1;
    }
  if (msgctl(mess_id, IPC_STAT, &buf) == -1)
    {
      perror("msgctl: msgctl failed");
      return -1;
    }

тоже ругается

$ ./msg
msgctl: msgctl failed: Identifier removed
Uncle Theodore

Нет, перезагрузка необязательна (наверное). Можно воспользоваться командой

ipcs и ipcrm

А mplayer не может создать shared memory segment…

Спасибо, я еще ковыряюсь…

Good Luck,

UT

Genie
ipcs и ipcrm

ага, помогло :) спасиба.

кстати, после этого оно уже больше не работает…

кстати, повторные запуски почему-то возвращают……

$ ./msg
msgget: msgget succeeded: msqid = 0