#define LIMMSGQ 0x20000l
#define MGFLAG 0777
struct lmsgstruct {
long mtype;
char mdata[32];
};
#define TESTTYPE 1
int Pliminit(int typenum,int procnum)
{
int msqid,i;
struct lmsgstruct rbuf;
msqid = msgget(LIMMSGQ+typenum, MGFLAG|IPC_CREAT);
if (msqid < 0)
{
return (-1);
}
while (msgrcv(msqid,(struct msgbuf *)&rbuf,sizeof(rbuf.mdata),0L,IPC_NOWAIT|MSG_NOERROR) >0);
rbuf.mtype = 1L;
memset(rbuf.mdata,‘T',sizeof(rbuf.mdata));
rbuf.mdata[sizeof(rbuf.mdata)-1] = ‘/0';
for (i = 0;i< procnum;i++)
if (msgsnd(msqid,(struct msgbuf *)&rbuf,sizeof(rbuf.mdata),IPC_NOWAIT) < 0)
{
return (-2);
}
return(1);
}
int Plimread(int typenum)
{
int msqid,ret;
struct lmsgstruct rbuf;
msqid = msgget(LIMMSGQ+typenum, MGFLAG);
if (msqid < 0)
{
return (-1);
}
ret = msgrcv(msqid,(struct msgbuf *)&rbuf,sizeof(rbuf.mdata),1L,IPC_NOWAIT|MSG_NOERROR);
if ((int )ret < (int )sizeof(rbuf.mdata))
{
return (-2);
}
return(1);
}
int Plimwrite(int typenum)
{
int msqid,ret;
struct lmsgstruct rbuf;
msqid = msgget(LIMMSGQ+typenum, MGFLAG);
if (msqid < 0)
{
return (-1);
}
rbuf.mtype = 1L;
memset(rbuf.mdata,‘M',sizeof(rbuf.mdata));
rbuf.mdata[sizeof(rbuf.mdata)-1] = ‘/0';
if (msgsnd(msqid,(struct msgbuf *)&rbuf,sizeof(rbuf.mdata),IPC_NOWAIT) < 0)
{
return (-2);
}
return(1);
}
int Plimend(int typenum)
{
int msqid;
struct msqid_ds ttt;
msqid = msgget(LIMMSGQ+typenum, MGFLAG);
if (msqid >= 0)
{
msgctl(msqid,IPC_RMID ,&ttt);
}
return(1);
}
main()
{
int ret;
ret = Pliminit(TESTTYPE,4);
/*初始化队列,设定最大进程数为4 */
if (ret < 0)
{
printf(“main:Pliminit failed!/n");
exit(-1);
}
while (1) s
int c;
printf(“测试主程序/n");
printf(“1——生成1个子进程/n");
printf(“0——退出/n");
scanf(“%1d",&c);
/*接收客户请求*/
if ( c == 0 )
break;
ret = Plimread(TESTTYPE);
/*检查正运行进程数是否已到最大并取得令牌*/
if(ret < 0)
/*正运行进程数已到最大,不进行业务处理*/
{
printf(“main:Plimread failed!/n");
printf(“system busy,please wait a moment!/n");
}
else
if ( fork() == 0 )
/*正运行进程数未到最大,生成子进程*/
{
/*进行相关业务处理*/
sleep(10);
/*假定业务处理时间为 10s*/
Plimwrite(TESTTYPE);
/*业务处理完毕,退还令牌,子进程退出*/
exit(1);
}
}
Plimend(TESTTYPE);
/*撤消队列*/
exit(1);
}
/* 编译方法:
cc -o ./ctltest ctltest.c
执行方法:
./ctltest
如果在10秒钟内欲连续生成5个子进程,那么在生成第5个子进程时,将失败;
等待10秒钟后,则可继续生成子进程。
*/