내가 원하는 것은 : 1 개의 기본 프로세스가 4 개의 하위 프로세스를 생성합니다. -> 기본 프로세스는 하위 프로세스의 메시지를 큐를 통해 수신하고 메시지를 인쇄합니다. -> 아이들은 대기열을 통해 메시지 (우선 순위 + 메시지가있는 문자열)를 보내고 마칩니다. CTRL + C를 누르면 잠시 후 (신호가 자식 코드에 있음) 자식이 끝난 다음 부모가 끝납니다. 현재로서는 mq_send() 및 mq_recieve()에 문제가 있습니다. 내가 wrong¿을 뭐하는 거지, 모두 mq_send()와 mq_receive은() -1 반환 이유를 모르겠어요Fork() 및 Posix 대기열. 보내기 및 받기 문자열
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
#include <mqueue.h>
void sigint_handler()
{
/*do something*/
printf("killing process %d\n",getpid());
exit(0);
}
int main()
{
mqd_t mqd;
struct mq_attr atributos;
// atributos.mq_maxmsg = 10;
//
// atributos.mq_msgsize = 50;
printf ("This is the parent. PID=%d\n",getpid());
int num_children = 4;
int i;
int pid;
int status;
char buffer [50];
while (1){
for (i=0; i<num_children ;i++){
if ((pid=fork()==0)){
signal(SIGINT, sigint_handler);
int prio = rand() % 3;
printf ("%d\n",prio);
char * msg= "Hi dude";
char * priority=NULL;
if (prio == 0){
priority = "NORMAL";
}
else {
priority = "URGENT";
}
char* toSend=NULL;
toSend = malloc(strlen(msg)+1+strlen(priority));
strcpy (toSend,priority);
strcat (toSend,msg);
printf ("%s\n",toSend);
if ((mqd=mq_open("/queue.txt", O_CREAT|O_WRONLY, 0777, &atributos))==-1){
printf ("Error mq_open\n");
exit(-1);
}
if (mq_send(mqd, msg , strlen(toSend), prio) == -1) {
printf ("Error mq_send\n");
exit (-1);
}
mq_close(mqd);
printf ("This is children %d\n",getpid());
sleep(1);
exit(0);
}
}
if ((mqd=mq_open("/queue.txt", O_CREAT|O_WRONLY, 0777, &atributos))==-1){
printf ("Error mq_open\n");
exit(-1);
}
//Rest Parent code
if (mq_receive(mqd, buffer, strlen(buffer),0)==-1){
printf ("Error mq_recieve\n");
exit(-1);
}
printf("Received: %s\n",buffer);
sleep (1);
waitpid(pid,&status,0);
printf ("This is the parent again %d, children should have finished\n",getpid());
mq_close(mqd);
}
}
: 음, 이건 내 코드? 그리고 내가 말하고있는 오류와 별개로 의도 한 것을하기 위해 내 코드에서 뭔가 잘못 보았습니다. 알려주세요. 미리 감사드립니다. 도움을 주셔서 감사합니다.
읽기 액세스 권한으로 두 번째'mq_open'을 열어야합니다. 예 : 'O_RDONLY' – naab