Linux的IPC机制(进程间通信)在系统编程的书里面总是会提到...想必很多人也在看..这里贴出一个我写的简单的例子..
semtest1.c包含了信号量、信号处理、共享内存三种操作..这里实现的功能很简单..就是直接让两个进程通信方式是共享内容,读写同步有名信号量实现的过程中,可以在shell下使用ipcs命令查看函数运行不同时刻,共享内存和信号量的信息,验证函数的作用。
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/sem.h>
- #include<stdlib.h>
- #include<errno.h>
- #include<string.h>
- #include<sys/types.h>
- #include<sys/ipc.h>
- #include<signal.h>
-
- #define FULL 1
- #define EMPTY 0
- #define KEY 33
- union semun {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- struct seminfo *__buf;
- };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- void sighandler(int signumber);
- void shdel(void);
- int server(void);
- int client(int shmid);
- int semlock(int semid,int semnum);
- int semunlock(int semid,int semnum);
- int delsemid,delshmid;
-
- int main(int argc,char *argv[])
- {
- if(argc==1)
- {server();}
- else if(argc==2)
- {client(atoi(argv[1]));}
-
-
-
-
-
- return 0;
- }
-
- int server(void)
- {
- if(signal(SIGINT,&sighandler)==SIG_ERR)
- {fprintf(stderr,"register SIGINT handler error...\n");exit(0);}
-
- int semid=semget(IPC_PRIVATE,2,IPC_CREAT|0660);
- union semun semset;
- semset.val=1;
- if(semctl(semid,EMPTY,SETVAL,semset)==-1)
- {fprintf(stderr,"semctl error! \nexiting ..\n");exit(0);}
-
- semset.val=0;
-
- if(semctl(semid,FULL,SETVAL,semset)==-1)
- {fprintf(stderr,"semctl error! \nexiting ...\n");exit(0);}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int shmid=shmget(KEY,128,IPC_CREAT|0660);
- if(shmid<0)
- {fprintf(stderr,"shared memory open error\n");exit(0);}
- void *shmdata;
- shmdata=shmat(shmid,0,0);
- if(shmdata==(void*)-1)
- {fprintf(stderr,"shmat error!\nexiting...\n");exit(0);}
- *(int*)shmdata=semid;
- char *buf=shmdata+sizeof(semid);
- printf("server is running with shmid:%d\n\n\n",shmid);
- delsemid=semid;
- delshmid=shmid;
- atexit(&shdel);
-
- while(1)
- {
- printf("waiting until buf is full.\n");
- fflush(stdout);
- semlock(semid,FULL);
- printf("buf is full,message:");
- printf("%s\n",buf);
- semunlock(semid,EMPTY);
- }
- return 0;
- }
-
- int client(int shmid)
- {
- int semid;
- char *buf;
- void *shmptr;
- shmptr=shmat(shmid,0,0);
- if(shmptr==(void*)-1)
- {printf("client shmat error...\n");exit(0);}
-
- semid=*(int*)shmptr;
- buf=shmptr+sizeof(semid);
-
- while(1)
- {
- printf("ready to write,waiting message read...\n...\n\n");
- semlock(semid,EMPTY);
- printf("Message's read...\ninput new message:");
- fgets(buf,128-sizeof(semid),stdin);
- semunlock(semid,FULL);
- }
- }
-
- int semlock(int semid,int semnum)
- {
-
-
-
- struct sembuf op;
- op.sem_num=semnum;
- op.sem_op=-1;
- op.sem_flg=0;
- semop(semid,&op,1);
- }
-
- int semunlock(int semid,int semnum)
- {
-
- struct sembuf op;
- op.sem_num=semnum;
- op.sem_op=1;
- op.sem_flg=0;
- semop(semid,&op,1);
- }
-
- void sighandler(int signumber)
- {
- printf("program is exiting...\n");
- exit(0);
- }
-
- void shdel()
- {
- shmctl(delshmid,IPC_RMID,0);
- semctl(delsemid,0,IPC_RMID);
- }
(jackyhwei) |