linux 處理序間通訊–systemV 訊息佇列 執行個體

來源:互聯網
上載者:User
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:執行結果訊息查詢
發送端及接收端結果



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.