min's devlog

메시지 수신 프로세스 본문

Linux/TCP IP Socket Programming

메시지 수신 프로세스

값진 2021. 4. 10. 22:40

지정한 프로세스에게 메시지를 전송하는 코드

파일명 : qsnd_pid.c
컴파일 : gcc -o qsnd_pid qsnd_pid.c
실행 : qsnd_pid 1234

#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#define BUFSZ 512

//메시지 내용 구조체 선언
typedef struct_msg{
        long msg_type;
        char msg_text[BUFSZ];
}msg_t ;

int main(int argc, char **argv){

        pid_t pid;
        int len, qid;
        msg_t pmsg;     //전송할 메시지
        key_t key;      //메시지 큐 key

        if(argc != 2){
                printf("USAGE : %s msqkey",argv[0]);
                exit(EXIT_FAILURE);
        }

        key = atoi(argv[1]);

        if((qid=msgget(key,IPC_CREAT|0600))<0){
                perror("msgget");
                exit(EXIT_FAILURE);
        }

        if((pid=fork())<0){
                printf("fork fail");
                exit(EXIT_FAILURE);
        }


        else if(pid>0){
                int nbytes;
                msg_t rmsg;
                printf("\n%d 프로세스 메시지큐 읽기 대기중..\n"getpid());
                nbytes=msgrcv(qid,&rmsg,BUFSZ,getpid(),0);
                printf("recv=5d bytes \n",nbytes);
                printf("type=%1d\n",rmsg.msg_type);
                printf("수신 프로세스 PID=%d\n",getpid());
                printf("value=%s\n",rmsg.msg_text);
                msgctl(qid,IPC_RMID,0);
                exit(EXIT_SUCCESS);
        }

        puts("Enter message to post : ");
        if( fgets((&pmsg)->msg_test,BUFSZ,stdin)==NULL){
                puts("no message to post");
                exit(EXIT_FAILURE);
        }



        pmsg.msg_type=getppid();
        len=strlen(pmsg.msg_text);

        if((msgsnd(qid,&pmsg,len,0))<0){
                perror("msgsnd fail");
                exit(EXIT_FAILURE);
        }

        puts("message posted");

        return 0;
}

'Linux > TCP IP Socket Programming' 카테고리의 다른 글

UDP 에코 서버  (0) 2021.04.10
파이프 기반의 프로세스간 통신  (0) 2021.04.10
SIGCHLD, wait()  (0) 2021.04.09
alarm() 인터럽트  (0) 2021.04.09
System Call 수행 중 함수 처리  (0) 2021.04.09
Comments