Моя программа не ждет и даже не показывает первый printf - PullRequest
0 голосов
/ 05 ноября 2011
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <time.h>
#include <sys/msg.h>
#include <sys/shm.h>



typedef struct{long type;char resultado[10];} MsgAnswerLoginStruct;


typedef struct{long tipo;int meupid;char login[20];char password[20];}MsgReqLoginStruct;


main(){

printf("i am here");

int msg_id, status;
MsgReqLoginStruct msg;
MsgAnswerLoginStruct msg2;

msg_id = msgget(2000, 0600 | IPC_CREAT);
if(msg_id == -1){
    printf("erro\n");
    exit(1);
}


status = msgrcv(msg_id, &msg, sizeof(msg) - sizeof(long) , 1,  0);
if(status < 0){
    printf("erro2\n");
    exit(1);
}


printf("Tentativa de Autenticação de PID = %d\n", msg.meupid);

}

вот моя проблема, это программа, которая получает сообщения от IPC, но он продолжает ждать, даже когда я пытаюсь отправить из другого процесса .. И я положил этот printf для отладки .. Он не появляетсяна моей консоли ?!Зачем ?когда я запускаю программу, она просто продолжает ждать .. Заранее спасибо, ребята !!

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Потому что вы не очищаете буфер. Вероятно, stdout является буферизованной строкой в ​​вашей реализации.

Попробуйте:

printf("i am here\n");
                  ^^

Или

printf("i am here");
fflush(stdout);
0 голосов
/ 05 ноября 2011

Это не связано с вашим конкретным вопросом, но вы действительно должны лучше обрабатывать ошибки msgget / msgrcv. Обе функции устанавливают errno, когда они терпят неудачу, и вы можете использовать это, чтобы предоставить пользователю полезную информацию о природе ошибки. Просто напишите:

if( status < 0 ) {
    perror( "msgrcv" );
    exit( EXIT_FAILURE );
}

perror - это самый простой способ получить информацию из errno. Если вы хотите более сложное сообщение об ошибке, вы можете использовать strerror. Например,

fprintf( stderr, "Some error message: %s\n", strerror( errno ));

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

0 голосов
/ 05 ноября 2011

Вы также можете использовать strace, чтобы понять, какие системные вызовы выполняет программа.

...