⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 创建信号量.txt

📁 创建信号量的c语言程序
💻 TXT
字号:
/* Creat the semaphore */

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>

#define flag1 IPC_CREAT|IPC_EXEL|00666
#define flag2 IPC_CREAT|00666
#define max_tries 3

union semnu{
    int val;
    struct semid_ds * buf;
    ushort_t * array;
}sem;

int main(key_t key,int i,int j){
    union semnu sem;
    int semid;
    int tmperrno;
    int init_ok=0;
    int k;
    struct semid_ds sem_info;
    sem.val=j;
    semid=semget(key,i,flag1);
    if(semid==-1){
        tmperrno=errno;
        if(tmperrno==EEXIST){
            semid=semget(key,i,flag2);
            sem.buf=&sem_info;
            for(k=0;k<max_tries;k++){
                if(semctl(semid,0,IPC_STAT,sem)==-1){
                    fprintf(stderr,"Control Semaphore Error:[%s]\n",sererror(errno));
                    k=max_tries;
                }
                else{
                    if(sem.buf->sem_otime!=0){
                        k=max_tries;
                        init_ok=1;
                    }
                    else
                        sleep(1);
                }
            }
            if(!init_ok){
                if(semctl(semid,0,SETVAL,sem.val)==-1)
                    fprintf(stderr,"Initiate Semaphore Error:[%s]\n",strerror(errno));
            }            
            else
                printf("semget error,process exit")
    }
    else{
        if(semctl(semid,0,SETVAL,sem)==-1)
            printf("semctl setval error");
    }
    printf("process [%d] creat semaphore [%d]\n",getpid(),semid);
    return semid;
} 
            
         
        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -