1:訊息接收端
#include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<string.h>#include <sys/wait.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include <errno.h>#include <sys/stat.h>#define MAX_TEXT 512struct my_msg_st{int my_msg_type;char msg_text[MAX_TEXT];};#define MSG_FILE "/wlan/configap/mkwrielessconfig.sh"#define MSG_FLAG IPC_CREAT|S_IRUSR|S_IWUSRint msgid=0;void signalHandler(int sig){#if 0 switch (sig) { case SIGINT: case SIGTERM: if (msgctl(msgid, IPC_RMID, NULL) == -1) { perror("msgget() failed to delete old queue"); } else { printf("remove msgid:%d\n",msgid); } }#endif printf("main process exit\n"); exit(0);}int checkSelect(int handfd,char *rwflag){int ret, retval=0xff; fd_set readfds, writefds;struct timevaltimeout; FD_ZERO(&readfds); FD_ZERO(&writefds); static int numfds = 0; if (handfd >= numfds) { numfds = handfd + 1; /* Record maximum fd + 1 */ } if (strchr(rwflag, 'r') != NULL) { FD_SET(handfd, &readfds); } if (strchr(rwflag, 'w') != NULL) { FD_SET(handfd, &writefds); }while (1){/*設定阻塞時間為5秒*/timeout.tv_sec = 0;timeout.tv_usec = 20;retval =0xff;ret = select(numfds, &readfds, &writefds, NULL, &timeout);switch (ret){case 0://exit(0);break;case -1:perror("select");exit(1);break;default: if (FD_ISSET(handfd, &readfds)) { retval =0; FD_CLR(handfd, &readfds); FD_SET(handfd, &readfds); } if(FD_ISSET(handfd, &writefds)) { retval =1; FD_CLR(handfd, &writefds); FD_SET(handfd, &writefds); } break; }// printf("time out1--------------\n"); return retval;}}int main(int argc,char *argv[]){int running=1;int childPid;struct my_msg_st some_data;int fd=0;char buffer[BUFSIZ];int msg_to_receive=2;int stat_val; key_t key; if((key=ftok(MSG_FILE,'a'))==-1) {fprintf(stderr,"Creat Key Error:%s\n\n",strerror(errno));exit(1); }if((msgid=msgget(key,MSG_FLAG)) == -1){perror("msgget");exit(0);}#if 0childPid=fork();if( childPid < 0 ){exit(0);}else if( childPid == 0 ){while(running){if(msgrcv(msgid,(void *)&some_data,BUFSIZ,msg_to_receive,0)==-1){perror("msgrcv");exit(EXIT_FAILURE);}printf("\nreceiver mssage:%s",some_data.msg_text);if(strncmp(some_data.msg_text,"end",3)==0){running=0;kill(getppid(),SIGINT);}}}else{#if 1struct sigaction sa;sa.sa_handler = signalHandler;sa.sa_flags = 0;/* Interrupt system calls */sigemptyset(&sa.sa_mask);sigaction(SIGINT, &sa, NULL);sigaction(SIGQUIT, &sa, NULL);#endifwhile(running){printf("Enter the mssage to send:");fgets(buffer,BUFSIZ,stdin);some_data.my_msg_type=1;strcpy(some_data.msg_text,buffer);if((msgsnd(msgid,(void *)&some_data,MAX_TEXT,0))==-1){perror("msgsnd");exit(EXIT_FAILURE);}if(strncmp(buffer,"end",3)==0){running=0;printf("kill child pid:%d getpid:%d\n",childPid,getpid());kill(childPid,SIGINT);}}}printf("pid:%d getpid:%d\n",childPid,getpid());waitpid(childPid, &stat_val, 0);if (WIFEXITED(stat_val)){printf("Child exited with code %d\n", WEXITSTATUS(stat_val));}else if (WIFSIGNALED(stat_val)){printf("Child terminated abnormally, signal %d\n", WTERMSIG(stat_val));}#endif#if 1while(1){if(checkSelect(fd,"r")==0){printf("Enter the mssage to send:");fgets(buffer,BUFSIZ,stdin);some_data.my_msg_type=1;strcpy(some_data.msg_text,buffer);if((msgsnd(msgid,(void *)&some_data,MAX_TEXT,0))==-1){perror("msgsnd");exit(EXIT_FAILURE);}if(strncmp(buffer,"end",3)==0){running=0;} }if(running){if(msgrcv(msgid,(void *)&some_data,BUFSIZ,msg_to_receive,IPC_NOWAIT)==-1){}else{printf("\nreceiver mssage:%s",some_data.msg_text);if(strncmp(some_data.msg_text,"end",3)==0){running=0;}}}if(running==0){if(msgctl(msgid,IPC_RMID,0)==-1){if(EINVAL == errno){msgctl(msgid,IPC_RMID,0);exit(EXIT_FAILURE);}}else{printf("remove msgid:%d\n",msgid);}exit(0);}}#endifreturn 0;}2:訊息發送端
#include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<string.h>#include <sys/wait.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include <errno.h>#include <sys/stat.h>#define MSG_FILE "/wlan/configap/mkwrielessconfig.sh"#define MSG_FLAG IPC_CREAT|S_IRUSR|S_IWUSRint msgid=0;#define MAX_TEXT 512struct my_msg_st{int my_msg_type;char msg_text[MAX_TEXT];};void signalHandler(int sig){#if 0 printf("-----------------------\n");if(SIGINT == sig){if (msgctl(msgid, IPC_RMID, NULL) == -1){perror("msgget() failed to delete old queue");}else{printf("remove msgid:%d\n",msgid);}}#endif printf("main process exit\n");exit(0);}int main(int argc,char *argv[]){int running=1;int childPid;struct my_msg_st some_data;char buffer[BUFSIZ];int msg_to_receive=1;int stat_val; key_t key; if((key=ftok(MSG_FILE,'a'))==-1) {fprintf(stderr,"Creat Key Error:%s\n\n",strerror(errno));exit(1); }if((msgid=msgget(key,MSG_FLAG)) == -1){perror("msgget");exit(0);}childPid=fork();if( childPid < 0 ){exit(0);}else if( childPid == 0 ){while(running){if(msgrcv(msgid,(void *)&some_data,BUFSIZ,msg_to_receive,0)==-1){perror("msgrcv");exit(EXIT_FAILURE);}printf("\nreceiver mssage:%s",some_data.msg_text);if(strncmp(some_data.msg_text,"end",3)==0){running=0;kill(getppid(),SIGINT);}}}else{#if 1struct sigaction sa;sa.sa_handler = signalHandler;sa.sa_flags = 0;/* Interrupt system calls */sigemptyset(&sa.sa_mask);sigaction(SIGINT, &sa, NULL);sigaction(SIGQUIT, &sa, NULL);#endifwhile(running){printf("Enter the mssage to send:");fgets(buffer,BUFSIZ,stdin);some_data.my_msg_type=2;strcpy(some_data.msg_text,buffer);if((msgsnd(msgid,(void *)&some_data,MAX_TEXT,0))==-1){perror("msgsnd");exit(EXIT_FAILURE);}if(strncmp(buffer,"end",3)==0){running=0;printf("kill child pid:%d getpid:%d\n",childPid,getpid());kill(childPid,SIGINT);}}}printf("pid:%d getpid:%d\n",childPid,getpid());waitpid(childPid, &stat_val, 0);if (WIFEXITED(stat_val)){printf("Child exited with code %d\n", WEXITSTATUS(stat_val));}else if (WIFSIGNALED(stat_val)){printf("Child terminated abnormally, signal %d\n", WTERMSIG(stat_val));}if(msgctl(msgid,IPC_RMID,0)==-1){if(EINVAL == errno){msgctl(msgid,IPC_RMID,0);exit(EXIT_FAILURE);}}else{printf("remove msgid:%d\n",msgid);}return 0;}
3:執行結果訊息查詢
發送端及接收端結果