我的程序一直在等待,甚至没有显示第一个printf

时间:2011-11-05 19:09:57

标签: c ipc

#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 个答案:

答案 0 :(得分:1)

因为你没有冲洗缓冲区。在您的实现中,stdout可能是行缓冲的。

尝试:

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

或者

printf("i am here");
fflush(stdout);

答案 1 :(得分:0)

您还可以使用strace来了解程序正在执行的系统调用。

答案 2 :(得分:0)

这与您的具体问题无关,但您应该更好地处理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。您不希望错误消息转到stdout。