免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6764 | 回复: 14
打印 上一主题 下一主题

IPC sample [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-04-17 14:58 |只看该作者 |倒序浏览
经常有人问IPC的问题,下面是一些简单的例子。有空看看!
System V信号量

  1. #define PERMS S_IRUSR|S_IWUSR

  2. void init_semaphore_struct(struct sembuf *sem,int semnum,
  3. int semop,int semflg)
  4. {
  5. /* 初始话信号灯结构 */
  6. sem->;sem_num=semnum;
  7. sem->;sem_op=semop;
  8. sem->;sem_flg=semflg;
  9. }

  10. int del_semaphore(int semid)
  11. {
  12. /* 信号灯并不随程序的结束而被删除,如果我们没删除的话(将1改为0)
  13. 可以用ipcs命令查看到信号灯,用ipcrm可以删除信号灯的
  14. */
  15. #if 1
  16. return semctl(semid,0,IPC_RMID);
  17. #endif
  18. }

  19. int main(int argc,char **argv)
  20. {
  21. char buffer[MAX_CANON],*c;
  22. int i,n;
  23. int semid,semop_ret,status;
  24. pid_t childpid;
  25. struct sembuf semwait,semsignal;

  26. if((argc!=2)||((n=atoi(argv[1]))<1))
  27. {
  28. fprintf(stderr,"Usage:%s number\n\a",argv[0]);
  29. exit(1);
  30. }

  31. /* 使用IPC_PRIVATE 表示由系统选择一个关键字来创建 */
  32. /* 创建以后信号灯的初始值为0 */
  33. if((semid=semget(IPC_PRIVATE,1,PERMS))==-1)
  34. {
  35. fprintf(stderr,"[%d]:Acess Semaphore Error:%s\n\a",
  36. getpid(),strerror(errno));
  37. exit(1);
  38. }

  39. /* semwait是要求资源的操作(-1) */
  40. init_semaphore_struct(&semwait,0,-1,0);

  41. /* semsignal是释放资源的操作(+1) */
  42. init_semaphore_struct(&semsignal,0,1,0);

  43. /* 开始的时候有一个系统资源(一个标准错误输出) */
  44. if(semop(semid,&semsignal,1)==-1)
  45. {
  46. fprintf(stderr,"[%d]:Increment Semaphore Error:%s\n\a",
  47. getpid(),strerror(errno));
  48. if(del_semaphore(semid)==-1)
  49. fprintf(stderr,"[%d]:Destroy Semaphore Error:%s\n\a",
  50. getpid(),strerror(errno));
  51. exit(1);
  52. }

  53. /* 创建一个进程链 */
  54. for(i=0;i if(childpid=fork()) break;

  55. sprintf(buffer,"[i=%d]-->;[Process=%d]-->;[Parent=%d]-->;[Child=%d]\n",
  56. i,getpid(),getppid(),childpid);
  57. c=buffer;

  58. /* 这里要求资源,进入原子操作 */
  59. while(((semop_ret=semop(semid,&semwait,1))==-1)&&(errno==EINTR));
  60. if(semop_ret==-1)
  61. {
  62. fprintf(stderr,"[%d]:Decrement Semaphore Error:%s\n\a",
  63. getpid(),strerror(errno));
  64. }
  65. else
  66. {
  67. while(*c!='\0')fputc(*c++,stderr);
  68. /* 原子操作完成,赶快释放资源 */
  69. while(((semop_ret=semop(semid,&semsignal,1))==-1)&&(errno==EINTR));
  70. if(semop_ret==-1)
  71. fprintf(stderr,"[%d]:Increment Semaphore Error:%s\n\a",
  72. getpid(),strerror(errno));
  73. }

  74. /* 不能够在其他进程反问信号灯的时候,我们删除了信号灯 */
  75. while((wait(&status)==-1)&&(errno==EINTR));
  76. /* 信号灯只能够被删除一次的 */
  77. if(i==1)
  78. if(del_semaphore(semid)==-1)
  79. fprintf(stderr,"[%d]:Destroy Semaphore Error:%s\n\a",
  80. getpid(),strerror(errno));
  81. exit(0);
  82. }
复制代码

SystemV消息队列

  1. #define MSG_FILE "server.c"
  2. #define BUFFER 255
  3. #define PERM S_IRUSR|S_IWUSR

  4. struct msgtype {
  5. long mtype;
  6. char buffer[BUFFER+1];
  7. };

  8. int main()
  9. {
  10. struct msgtype msg;
  11. key_t key;
  12. int msgid;

  13. if((key=ftok(MSG_FILE,'a'))==-1)
  14. {
  15. fprintf(stderr,"Creat Key Error:%s\a\n",strerror(errno));
  16. exit(1);
  17. }

  18. if((msgid=msgget(key,PERM|IPC_CREAT|IPC_EXCL))==-1)
  19. {
  20. fprintf(stderr,"Creat Message Error:%s\a\n",strerror(errno));
  21. exit(1);
  22. }

  23. while(1)
  24. {
  25. msgrcv(msgid,&msg,sizeof(struct msgtype),1,0);
  26. fprintf(stderr,"Server Receive:%s\n",msg.buffer);
  27. msg.mtype=2;
  28. msgsnd(msgid,&msg,sizeof(struct msgtype),0);
  29. }
  30. exit(0);
  31. }


  32. --------------------------------------------------------------------------------

  33. 客户端(client.c)

  34. #include
  35. #include
  36. #include
  37. #include
  38. #include
  39. #include
  40. #include
  41. #include
  42. #define MSG_FILE "server.c"
  43. #define BUFFER 255
  44. #define PERM S_IRUSR|S_IWUSR

  45. struct msgtype {
  46. long mtype;
  47. char buffer[BUFFER+1];
  48. };

  49. int main(int argc,char **argv)
  50. {
  51. struct msgtype msg;
  52. key_t key;
  53. int msgid;

  54. if(argc!=2)
  55. {
  56. fprintf(stderr,"Usage:%s string\n\a",argv[0]);
  57. exit(1);
  58. }

  59. if((key=ftok(MSG_FILE,'a'))==-1)
  60. {
  61. fprintf(stderr,"Creat Key Error:%s\a\n",strerror(errno));
  62. exit(1);
  63. }

  64. if((msgid=msgget(key,PERM))==-1)
  65. {
  66. fprintf(stderr,"Creat Message Error:%s\a\n",strerror(errno));
  67. exit(1);
  68. }

  69. msg.mtype=1;
  70. strncpy(msg.buffer,argv[1],BUFFER);
  71. msgsnd(msgid,&msg,sizeof(struct msgtype),0);
  72. memset(&msg,'\0',sizeof(struct msgtype));
  73. msgrcv(msgid,&msg,sizeof(struct msgtype),2,0);
  74. fprintf(stderr,"Client receive:%s\n",msg.buffer);
  75. exit(0);
  76. }
复制代码

SystemV共享内存

  1. #define PERM S_IRUSR|S_IWUSR

  2. int main(int argc,char **argv)
  3. {

  4. int shmid;
  5. char *p_addr,*c_addr;
  6. if(argc!=2)
  7. {
  8. fprintf(stderr,"Usage:%s\n\a",argv[0]);
  9. exit(1);
  10. }

  11. if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)
  12. {
  13. fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));
  14. exit(1);
  15. }
  16. if(fork())
  17. {
  18. p_addr=shmat(shmid,0,0);
  19. memset(p_addr,'\0',1024);
  20. strncpy(p_addr,argv[1],1024);
  21. exit(0);
  22. }
  23. else
  24. {
  25. c_addr=shmat(shmid,0,0);
  26. printf("Client get %s",c_addr);
  27. exit(0);
  28. }
  29. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2003-04-17 15:46 |只看该作者

IPC sample

哈哈,太好了,结合实例理解加深不少呢!
我自己编程实现的都是单个进程间的:)

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2003-04-17 16:00 |只看该作者

IPC sample

SYSTEM V MSG


请求方程序

  1. static struct msgbuf1{

  2. long mtype;

  3. char mtext[100];

  4. } sndbuf, rcvbuf, *msgp ;

  5. extern int errno;

  6. main(int argc, char **argv)

  7. { int rtrn, msqid ;

  8. char name[10];

  9. double balance;

  10. if (argc!=2){ fprintf(stderr,

  11. "msgreq [01-99]\n"); exit(-1); }

  12. if ( (msqid = msgget(0x888, IPC_CREAT|0660)) == -1 ){

  13. fprintf(stderr, "msgget 888 failed !\n"); exit(-1);

  14. }

  15. msgp=&

  16. sprintf(sndbuf.mtext,"%2.2s",argv[1]);

  17. printf("输入4位帐号:");

  18. scanf("%s",&sndbuf.mtext[2]);

  19. sndbuf.mtext[6]=0;

  20. msgp->;mtype=666;

  21. rtrn=msgsnd(msqid,msgp, strlen(sndbuf.mtext), 0);

  22. if (rtrn==-1){

  23. perror("msgsnd"); exit(-1);

  24. }

  25. msgp=&

  26. fprintf(stderr,"等待后台数据处理进程的回答....");

  27. rtrn=msgrcv(msqid,msgp, 100, atoi(argv[1]), 0);

  28. if(rtrn==-1){ perror("msgrcv"); exit(-1); }

  29. sscanf(rcvbuf.mtext,"%[^|]|%lf",name,&balance);

  30. printf("\n姓名=%s\n",name);

  31. printf("余额=%lf\n",balance);

  32. }
复制代码




服务方程序

  1. static struct msgbuf1{

  2. long mtype;

  3. char mtext[100];

  4. } sndbuf, rcvbuf , *msgp;

  5. extern int errno;

  6. main()

  7. { int rtrn, msgqid ;

  8. char strbuf[100];

  9. if ( (msqid = msgget(0x888, IPC_CREAT|0600)) == -1 ){

  10. fprintf(stderr, "msgget 888 failed !\n"); exit(-1);

  11. }

  12. while(1) {

  13. msgp=&

  14. fprintf(stderr,"等待前台进程的请求....");

  15. rtrn=msgrcv(msqid, msgp, 100, 666 ,MSG_NOERROR);

  16. if(rtrn==-1){ perror("msgrcv");exit(-1); }

  17. msgp=&

  18. sprintf(strbuf,"%2.2s\0",rcvbuf.mtext);

  19. msgp->;mtype=atoi(strbuf);

  20. printf("\n输入帐号=%4.4s的帐户姓名:",&rcvbuf.mtext[2]);

  21. scanf("%s",sndbuf.mtext);

  22. strcat(sndbuf.mtext,"|");

  23. printf("输入该帐户余额:");

  24. scanf("%s",strbuf);

  25. strcat(sndbuf.mtext,strbuf);

  26. rtrn=msgsnd(msqid,msgp, strlen(sndbuf.mtext), 0);

  27. if (rtrn==-1){ perror("msgsnd"); exit(-1); }

  28. }

  29. }



复制代码

论坛徽章:
0
4 [报告]
发表于 2003-04-18 09:50 |只看该作者

IPC sample

我觉得这是个好东东,藏在后面怕有人看不见。所以
UP

论坛徽章:
0
5 [报告]
发表于 2003-04-18 10:12 |只看该作者

IPC sample

往上顶一顶,不错,够热心的。

论坛徽章:
0
6 [报告]
发表于 2003-04-25 14:34 |只看该作者

IPC sample

太好了!
谢谢!
强烈UP!

论坛徽章:
0
7 [报告]
发表于 2003-06-07 14:11 |只看该作者

IPC sample

good,up

论坛徽章:
0
8 [报告]
发表于 2003-06-08 10:44 |只看该作者

IPC sample

up

论坛徽章:
0
9 [报告]
发表于 2003-06-08 14:24 |只看该作者

IPC sample

sscanf(rcvbuf.mtext,"%[^|]|%lf",name,&balance);
这句话看不懂,,"%[^|]|%lf",是什么意思噢?

论坛徽章:
0
10 [报告]
发表于 2003-06-12 11:22 |只看该作者

IPC sample

好!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP