Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не отправляется сообщение, msgsnd(...) 
:(
    Опции темы
Joil
Дата 8.4.2010, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 24.1.2008

Репутация: нет
Всего: 8



msgdata.h:
Код

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc/h>
#include <sys/msg.h>

#define BUF_LEN 256

typedef struct _msgdata_ {
    long int mtype;
    char msgbuf[BUF_LEN];
    double numbers[BUF_LEN];
    int msglen;
    int id_process;
} MSGDATA;

#define MSGDATA_LEN (2 * sizeof(int) + BUF_LEN + BUF_LEN * sizeof(double))

#define MSG_KEY 1223

int msg_open(int key);
int msg_close(int id);


msgdata.c:
Код

#include "msgdata.h"

#define SHM_KEY 1221
#define SEM_KEY (1221+1)

int msg_open(int key) {
    int msg_id;
    if ((msg_id = msgget (key, 0)) == -1) {
        if (errno == ENOENT) {
            if ((msg_id = msgget(key, IPC_CREAT | 0664)) == -1) {
                fprintf(stderr, "Cannot create message queue\n");
                return 0;
            }
        }
        else {
            fprintf(stderr, "Cannot get message queue\n");
            return 0;
        }
    }
    return msg_id;
}

int msg_close(int id) {
    msgctl(id, IPC_RMID, 0);
    return 0;
}


main.c:
Код

#include "msgdata.h"

int start_process(char* files [], int quantity) {
    int msg_id;
    pid_t id_process;

    if ((msg_id = msg_open(MSG_KEY)) == -1) {
        return -1;
    }
    
    int i = 0, j = 0;
    for (i = 0; i < quantity; i++) {
        id_process = fork();
        if (id_process == -1) {
            return -2;
        }
        else if (id_process == 0) {
            MSGDATA msg_data;
            msg_data.mtype = 1;
            memset(msg_data.msgbuf, 0, BUF_LEN);
            FILE* file = fopen(files[i], "rb");
            int count = 0;
            msg_data.idProcess = i;
            while (!feof(file) {
                char number_char[50];
                fscanf(file, "%s", number_char);
                double numder_double = atof(number_char);
                msg_data.numbers[count] = numder_double;
                msg_data.msglen++;
                count++;
            }
            if (msgsnd(msg_id, &msg_data, MSGDATA_LEN, 0) != -1) {
                printf("Message sent\n");
            }
            else {
                printf("Message not sent\n");
            }
            return 0;
        }
        else {
        }
    }
    sleep(1);
}

int main() {
    int quantity = 4
    char* files [] = {"123.txt", "234.txt", "345.txt", "456.txt"};
    startProcess(files, quantity);
}


Всем привет, код выше компилится нормально (mpicc -o main -lm main.c msgsnd.c) но при запуске (./main) программа висит, как будто в очереди нет места и она ожидает появление свободного... 
Почему? И как это исправить, запарился уже :-(

Это сообщение отредактировал(а) Joil - 8.4.2010, 15:29
--------------------
Who had deceived thee so often as thyself? © Benjamin Franklin--------------------Always bear in mind that your own resolution to succeed is more important than any other. © Abraham Lincoln--------------------If you need it - do it, if you want it - take it! © ...
PM MAIL ICQ   Вверх
Loginanton
Дата 22.4.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 8.11.2007

Репутация: нет
Всего: нет



Аналогичная проблема. Только заметил одну вещь: если получать id очереди (msgget) в коде общем для процессов, т.е. до fork(), то всё ок, а если получать id очереди после fork(), то уже трабл. Хотя id возвращается в обоих случаях один и тот же.  smile  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.