- 论坛徽章:
- 0
|
root@zxc:/home/zxc/work/IPC# ./ipc
I creat 3899290.030000 // 刚开始都很正常,先创建后吃
I eat 3899290.030000
I creat 11594766.800000
I eat 11594766.800000
I creat 8487198.630000
I eat 8487198.630000
I creat 5467618.510000
I eat 5467618.510000
^CI get Init // 这里我点下了 ctrl+c
I eat 2465814.240000
I get Init
I creat 2465814.240000
I eat 2465814.240000
I creat 2465814.240000
I eat 20923460.250000 // 变成了 先吃 后创建。。。。
I creat 20923460.250000
I eat 7156795.030000
I creat 7156795.030000
I eat 4110252.640000
I creat 4110252.640000
为毛啊? 请大侠帮忙解释一下 。
源码:
#include "stdio.h"
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/signal.h>
typedef struct
{
double randnum;
}ShmStru;
int v(int semid,int semno)
{
struct sembuf buf;
memset(&buf,0,sizeof(struct sembuf));
buf.sem_num=semno;
buf.sem_op=1;
buf.sem_flg=0;
return semop(semid,&buf,1);
}
int p(int semid,int semno)
{
struct sembuf buf;
memset(&buf,0,sizeof(struct sembuf));
buf.sem_num=semno;
buf.sem_op=-1;
buf.sem_flg=0;
return semop(semid,&buf,1);
}
void handleSigint(int signo)
{
printf("I get Init\n" ;
}
int main()
{
key_t key;
int semid,shmid;
ShmStru *pstru;
int semarray[2];
pid_t pid;
int n;
signal(SIGINT,handleSigint); // 这里截获SIGINT信号
if((key = ftok("/etc/profile",0))<0)
{
perror("ftok" ;
exit(1);
}
if((semid = semget(key,2,IPC_CREAT|IPC_EXCL|0666))<0)
{
perror("semget" ;
exit(2);
}
if((shmid=shmget(key,sizeof(ShmStru),IPC_CREAT|IPC_EXCL|0666))<0)
{
perror("shmget" ;
exit(3);
}
if((pstru = shmat(shmid,NULL,0))==(void *)-1)
{
perror("shmat" ;
exit(4);
}
semarray[0]=1;
semarray[1]=0;
if(semctl(semid,2,SETALL,semarray)<0)
{
perror("semctl" ;
exit(5);
}
pstru->randnum=0.00;
if((pid = fork())==0)
{
for(;
{
p(semid,1);
printf("I eat %f\n",pstru->randnum); //消费它,即打印到屏幕
v(semid,0);
}
}else
{
//for(n=0;n<10;n++)
for(;
{
p(semid,0);
srand(time(NULL));
pstru->randnum=(double)(rand()*0.01); //Creat一个随机浮点数
sleep(1);
printf("I creat %f\n",pstru->randnum);
v(semid,1);
}
kill(pid,SIGKILL);
}
if(shmdt(pstru)==-1)
{
perror("shmdt" ;
exit(6);
}
shmctl(shmid,IPC_RMID,0);
semctl(semid,IPC_RMID,0);
return 0;
}
|
|