#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调试..它没出现在我的控制台上?!为什么? 当我运行程序时它只是在等待.. 先谢谢你们!!
答案 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。