Это не связано с вашим конкретным вопросом, но вы действительно должны лучше обрабатывать ошибки 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. Вы не хотите, чтобы сообщения об ошибках отправлялись на стандартный вывод.