- 论坛徽章:
- 0
|
- #include <stdio.h>
- #include <unistd.h>
- #include <limits.h>
- #include <errno.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/stat.h>
- #include <sys/wait.h>
- //#include <sys/rpc.h>
- #include <sys/sem.h>
- #define PERMS S_IRUSR|S_IWUSR
- #define MAX_COUNT 10240
- void init_semaphore_struct(struct sembuf *sem,int semnum,int semop,int semflg){
- /**/
- sem->sem_num=semnum;
- sem->sem_op=semop;
- sem->sem_flg=semflg;
- }
- int del_semaphore(int semid){
- #if 1
- return semctl(semid,0,IPC_RMID);
- #endif
- }
- int main(int argc,char **argv){
- char buffer[MAX_COUNT],*c;
- int i,n;
- int semid,semop_ret,status;
- pid_t childpid;
- struct sembuf semwait,semsignal;
- if((argc!=2) || ((n=atoi(argv[1]))<1))
- {
- fprintf(stderr,"Usage:.....");
- exit(1);
- }
- /**/
- if((semid=semget(IPC_PRIVATE,1,PERMS))==-1){
- fprintf(stderr,"Access Sem error");
- exit(1);
- }
- /**/
- init_semaphore_struct(&semwait,0,-1,0);
- /**/
- init_semaphore_struct(&semwait,0,1,0);
- /**/
- if(semop(semid,&semsignal,1)==-1){
- fprintf(stderr,"Increasment sem error 1");
- if(del_semaphore(semid)==-1)
-
- fprintf(stderr,"Destory error 2");
- exit(1);
- }
- for(i=0;i<n;i++)
- if(childpid=fork()) break;
- sprintf(buffer,"[i=%d]->[process=%d]->[parent=%d]->[child=%d]\n",i,getpid(),
- getppid(),childpid);
- c=buffer;
- /**/
- while(((semop_ret=semop(semid,&semwait,1))==-1) && (errno==EINTR));
- if(semop_ret==-1){
- fprintf(stderr,"Deccreatment error3");
- }
- else{
- while(*c!='\0')fputc(*c++,stderr);
- /**/
- while(((semop_ret=semop(semid,&semsignal,1))==-1) && (errno==EINTR))
- {;}
- if(semop_ret==-1)
- fprintf(stderr,"Increat error3");
-
- }
- /**/
- fprintf(stderr," wait");
- while((wait(&status)==-1) && (errno==EINTR));
- fprintf(stderr,"i is %d\n",i);
- if(i==1)
- if(del_semaphore(semid)==-1)
- fprintf(stderr,"Destory error4");
- exit(0);
- }
复制代码
[ 本帖最后由 amoyppa 于 2006-5-29 14:53 编辑 ] |
|