nbsp; } else if (argv[1][0]=='a') {
first=0;
second=1;
}
else {
first=1;
second=0;
}
semid=semget(SEMKEY,2,0777);
psembuf.sem_op=-1;
psembuf.sem_flg=SEM_UNDO;
vsembuf.sem_op=1;
vsembuf.sem_flg=SEM_UNDO;
for (count=0;;xcount++) {
psembuf.sem_num=first;
semop(semid,&psembuf,1);
psembuf.sem_num=second;
semop(semid,&psembuf,1);
printf("proc %d count %d\n",getpid(),count);
vsembuf.sem_num=second;
semop(semid,&vsembuf,1);
vsembuf.sem_num=first;
semop(semid,&vsembuf,1);
}
}
24.sdenter()
功能:共享数据段同步访问,加锁.
语法:#include <sys/sd.h>
int sdenter(addr,flags)
char *addr;
int flags;
说明:用于指示调用进程即将可以访问共享数据段中的内容.
参数addr为将一个sdget()调用的有效返回码.
所执行的动作取决于flags的值:
. SD_NOWAIT:若另一个进程已对指定的段调用本系统调用且还没
有调用sdleave(),并且该段并非用SD_UNLOCK标志创建,则调
用进程不是等待该段空闲而是立即返回错误码.
. SD_WRITE:指示调用进程希望向共享数据段写数据.此时,另一
个进程用SD_RDONLY标志联接该共享数据段则不被允许.
返回值:调用成功则返回0,否则返回-1.
25.sdleave()
功能:共享数据段同步访问,解锁.
语法:#include <sys/sd.h>
&