C语言整理之信号量

C语言之信号量

Semaphore1.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

 

#define SHMKEY   1111

#define SHMSIZE  4096

#define SEMKEY   1111

 

union semun

{

int val;

struct semmid_ds *buf;

unsigned short *array;

struct seminfo *_buf;

 

};

 

int sem_p(int id)

{

int ret;

struct sembuf buf;

 

buf.sem_num = 0;

buf.sem_op = -1;

buf.sem_flg = SEM_UNDO;

 

ret = semop(id,&buf,1);

if(-1 == ret)

{

perror("semop");

return 1;

}

return 0;

}

 

int sem_v(int id)

{

 

int ret;

struct sembuf buf;

 

buf.sem_num = 0;

buf.sem_op = 1;

buf.sem_flg = SEM_UNDO;

 

ret = semop(id,&buf,1);

if(-1 == ret)

{

perror("semop");

return 1;

}

return 0;

}

int main()

{

int shmid,ret,count = 0;

void *shmaddr;

int semid;

union semun union_sem;

 

shmid = shmget(SHMKEY,SHMSIZE,IPC_CREAT | IPC_EXCL);

if(-1 == shmid)

{

perror("shmget");

exit(1);

}

 

shmaddr = shmat(shmid,NULL,0);

if((void *)-1 == shmaddr)

{

perror("shmat");

exit(1);

}

 

semid = semget(SEMKEY,1,IPC_CREAT | IPC_EXCL);

if(-1 == semid)

{

perror("semget");

exit(1);

}

 

union_sem.val = 1;

ret = semctl(semid,0,SETVAL,union_sem);

if(-1 == ret)

{

perror("semctl");

exit(1);

}

 

*(int *)shmaddr = count;

 

while(1)

{

sem_p(semid);

count = *(int *)shmaddr;

if(count > 100)

{

sem_v(semid);

break;

}

usleep(100000);

printf("Process1 : count = %d\n",count);

count++;

*(int *)shmaddr = count;

sem_v(semid);

}

 

usleep(100000);

ret = shmdt(shmaddr);

if(-1 == ret)

{

perror("shmdt");

exit(1);

}

 

ret = shmctl(shmid,IPC_RMID,NULL);

if(-1 == ret)

{

perror("shmctl");

exit(1);

}

 

ret = semctl(semid,0,IPC_RMID);

if(-1 == ret)

{

perror("semctl");

exit(1);

}

return 0;

}

 

 

 

Semaphore2.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

 

#define SHMKEY   1111

#define SHMSIZE  4096

#define SEMKEY   1111

 

union semun

{

int val;

struct semmid_ds *buf;

unsigned short *array;

struct seminfo *_buf;

 

};

 

int sem_p(int id)

{

int ret;

struct sembuf buf;

 

buf.sem_num = 0;

buf.sem_op = -1;

buf.sem_flg = SEM_UNDO;

 

ret = semop(id,&buf,1);

if(-1 == ret)

{

perror("semop");

return 1;

}

return 0;

}

 

int sem_v(int id)

{

 

int ret;

struct sembuf buf;

 

buf.sem_num = 0;

buf.sem_op = 1;

buf.sem_flg = SEM_UNDO;

 

ret = semop(id,&buf,1);

if(-1 == ret)

{

perror("semop");

return 1;

}

return 0;

}

 

int main()

{

int shmid,ret,count = 0;

void *shmaddr;

int semid;

union semun union_sem;

 

shmid = shmget(SHMKEY,SHMSIZE,0);

if(-1 == shmid)

{

perror("shmget");

exit(1);

}

 

shmaddr = shmat(shmid,NULL,0);

if((void *)-1 == shmaddr)

{

perror("shmat");

exit(1);

}

 

semid = semget(SEMKEY,1,0);

if(-1 == semid)

{

perror("semget");

exit(1);

}

 

/*union_sem.val = 1;

ret = semctl(semid,0,SETVAL,union_sem);

if(-1 == ret)

{

perror("semctl");

exit(1);

}*/

 

//*(int *)shmaddr = count;

 

while(1)

{

sem_p(semid);

count = *(int *)shmaddr;

if(count > 101)

{

sem_v(semid);

break;

}

usleep(100000);

printf("Process2 : count = %d\n",count);

count++;

*(int *)shmaddr = count;

sem_v(semid);

}

 

ret = shmdt(shmaddr);

if(-1 == ret)

{

perror("shmdt");

exit(1);

}

 

/*ret = shmctl(shmid,IPC_RMID,NULL);

if(-1 == ret)

{

perror("shmctl");

exit(1);

}

 

ret = semctl(semid,0,IPC_RMID);

if(-1 == ret)

{

perror("semctl");

exit(1);

}*/

return 0;

}

你可能感兴趣的:(C语言整理之信号量)