互斥区代码
char *getCurrFileName()
{
FILE *stream;
char fullname[1024];
stream=popen("pwd","r");
fread(fullname,sizeof(char),sizeof(fullname),stream);
{
int i;
for(i=0;i<strlen(fullname);i++)
{
if(fullname[i]=='\n')
{
fullname[i]=0;
break;
}
}
}
sprintf(fullname,"%s/%s",fullname,__FILE__);
pclose(stream);
return fullname;
}
int createCriticalSection(int id)
{
key_t sem_key=ftok(getCurrFileName(),id );
int SemID=-1;
int oflag = S_IRWXU | S_IRWXG | S_IRWXO;
union semun arg;
if ((SemID=semget(sem_key, 1, oflag | IPC_CREAT | 0660)) == -1)
{
return -1;
}
arg.val=1;
if (semctl(SemID, 0, SETVAL, arg) == -1)
{
return -1;
}
return SemID;
}
/*
@return 0 :成功
其他:失败
*/
int enterCriticalSection(int semID)
{
struct sembuf ops;
int rt;
sigset_t allset;
ops.sem_num = 0;
ops.sem_op = -1;
ops.sem_flg = 0;
sigfillset(&allset);
sigprocmask(SIG_SETMASK, &allset, &oldset);
if ((rt = semop(semID, &ops, 1)) == -1)
{
sigprocmask(SIG_SETMASK, &oldset, NULL);
}
return rt;
}
int releaseCriticalSection(int semID)
{
struct sembuf ops;
int rt;
ops.sem_num = 0;
ops.sem_op = 1;
ops.sem_flg = 0;
rt = semop(semID, &ops, 1);
sigprocmask(SIG_SETMASK, &oldset, NULL);
return rt;
}
int delCriticalSection(int semID)
{
if (semID != -1)
{
if (semctl(semID, IPC_RMID, NULL) != 0)
{
fprintf(stderr, "Failed to IPC_RMID semid:%d !\n", semID);
return -1;
}
return 0;
}
return -1;
}
{
FILE *stream;
char fullname[1024];
stream=popen("pwd","r");
fread(fullname,sizeof(char),sizeof(fullname),stream);
{
int i;
for(i=0;i<strlen(fullname);i++)
{
if(fullname[i]=='\n')
{
fullname[i]=0;
break;
}
}
}
sprintf(fullname,"%s/%s",fullname,__FILE__);
pclose(stream);
return fullname;
}
int createCriticalSection(int id)
{
key_t sem_key=ftok(getCurrFileName(),id );
int SemID=-1;
int oflag = S_IRWXU | S_IRWXG | S_IRWXO;
union semun arg;
if ((SemID=semget(sem_key, 1, oflag | IPC_CREAT | 0660)) == -1)
{
return -1;
}
arg.val=1;
if (semctl(SemID, 0, SETVAL, arg) == -1)
{
return -1;
}
return SemID;
}
/*
@return 0 :成功
其他:失败
*/
int enterCriticalSection(int semID)
{
struct sembuf ops;
int rt;
sigset_t allset;
ops.sem_num = 0;
ops.sem_op = -1;
ops.sem_flg = 0;
sigfillset(&allset);
sigprocmask(SIG_SETMASK, &allset, &oldset);
if ((rt = semop(semID, &ops, 1)) == -1)
{
sigprocmask(SIG_SETMASK, &oldset, NULL);
}
return rt;
}
int releaseCriticalSection(int semID)
{
struct sembuf ops;
int rt;
ops.sem_num = 0;
ops.sem_op = 1;
ops.sem_flg = 0;
rt = semop(semID, &ops, 1);
sigprocmask(SIG_SETMASK, &oldset, NULL);
return rt;
}
int delCriticalSection(int semID)
{
if (semID != -1)
{
if (semctl(semID, IPC_RMID, NULL) != 0)
{
fprintf(stderr, "Failed to IPC_RMID semid:%d !\n", semID);
return -1;
}
return 0;
}
return -1;
}
///使用
int criSec;
criSec=createCriticalSection(0);
if(enterCriticalSection(criSec)==0)//成功
{}
releaseCriticalSection(criSec);
delCriticalSection(criSec);