?? test2.c
字號:
#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/sem.h>
#include<sys/types.h>
#include"shm_com2.h"
static int semaphore_p(int);
static int semaphore_v(int);
static int set_semvalue(int);
static int del_semvalue(int);
//static int sem_id;
int main(int argc, char *argv[])
{
pid_t pid;
int sem_id;
int sem_id1;
srand((unsigned)getpid());
sem_id=semget((key_t)1243,1,0666|IPC_CREAT);
sem_id1=semget((key_t)12435,1,0666|IPC_CREAT);
if(sem_id==-1)
{
fprintf(stderr,"semget error");
exit(EXIT_FAILURE);
}
if (!set_semvalue(sem_id)) {
fprintf(stderr, "Failed to initialize semaphore\n");
exit(EXIT_FAILURE);
}
pid=fork();
switch(pid)
{
case -1:
perror("fork failed");
exit(1);
case 0:
{
if (!semaphore_p(sem_id1)) exit(EXIT_FAILURE);
printf("bbbb\n");
fflush(stdout);
if (!semaphore_v(sem_id)) exit(EXIT_FAILURE);
if (!semaphore_p(sem_id1)) exit(EXIT_FAILURE);
//if (!semaphore_p(sem_id)) exit(EXIT_FAILURE);
printf("dddd\n");
fflush(stdout); //sleep(1);
break;
}
default:
{
printf("aaaa\n");
fflush(stdout);
if(!set_semvalue(sem_id1))
{
fprintf(stderr,"Failure to initialize semaphore\n");
exit(EXIT_FAILURE);
}
if (!semaphore_v(sem_id1)) exit(EXIT_FAILURE);
//sleep(1);
//if (!semaphore_p()) exit(EXIT_FAILURE);
if (!semaphore_p(sem_id)) exit(EXIT_FAILURE);
printf("cccc\n");
fflush(stdout);
//sleep(1);
if (!semaphore_v(sem_id1)) exit(EXIT_FAILURE);
wait(0);
break;
}
del_semvalue(sem_id);
del_semvalue(sem_id1);
}
}
static int semaphore_p(int sem_id)
{
struct sembuf sem_b;
sem_b.sem_num=0;
sem_b.sem_op=-1;
sem_b.sem_flg=SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1)
{
fprintf(stderr,"semmaphore_p is error\n");
return (0);
}
return(1);
}
static int semaphore_v(int sem_id)
{
struct sembuf sem_b;
sem_b.sem_num=0;
sem_b.sem_op=1;
sem_b.sem_flg=SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1)
{
fprintf(stderr,"semmaphore_v is error\n");
return(0);
}
return(1);
}
static int set_semvalue(int sem_id)
{
union semun sem_union;
sem_union.val = 0;
if (semctl(sem_id, 0, SETVAL, sem_union) == -1) return(0);
return(1);
}
static int del_semvalue(int sem_id)
{
union semun sem_union;
sem_union.val=0;
if(semctl(sem_id,0,SETVAL,sem_union)==-1)
{
return(0);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -