Programming/C / C++
리눅스 소켓 프로그래밍(Fork() 사용)
Foolishdevil
2010. 5. 18. 18:46
리눅스에서 사용하는 소켓 프로그래밍 관련된 내용입니다.
출처 : 교수님.. ㅋ
출처 : 교수님.. ㅋ
#include#include #include #include #include #include #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; 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 read... process message..! waiting..\n", getpid()); nbytes = msgrcv(qid, &rmsg, BUFSZ, getpid(), 0); printf("recv = %d bytes \n", nbytes); printf("type = %ld \n", rmsg.msg_type); printf("Received process 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_text, 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; }