当前位置: 首页 > news >正文

做电台需要的文章从哪个网站找免费企业网站建设

做电台需要的文章从哪个网站找,免费企业网站建设,中国建设建行网站,cocos creator做网站1.认识信号量 方便理解:信号量就是一个计数器。当它大于0能用,小于等于0,用不了,这个值自己给。 2.特点: 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。信号量基于操作系统的 PV 操作&am…

1.认识信号量

        方便理解:信号量就是一个计数器。当它大于0能用,小于等于0,用不了,这个值自己给。

2.特点:

  1. 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
  2. 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。(P操作:拿锁。V操作:放回锁)
  3. 每次对信号量的 PV 操作不仅限于对信号量值加 1 或 减1 ,而且可以加加减任意正整数。
  4. 支持信号量组

3.有关api:

#include <sys/sem.h>//1.创建或获取一个信号量组:若成功返回信号量级ID,失败返回-1
int semget(key_t key, int num_sems, int sem_flags);//2.对信号量组进行操作,改变信号量的值:成功返回0,失败返回-1
int semop(int semid, struct sembuf semoparray[], size_t numops);//3.控制信号量的相关信息
int semctl(int semid, int sem_num, int cmd, ...);

1.semget

功能:创建一个新的信号量或获取一个已经存在的信号量的键值。

返回值:成功返回信号量的标识码ID。失败返回-1;

参数:

key  为整型值,用户可以自己设定。有两种情况:

1.       键值是IPC_PRIVATE,该值通常为0,意思就是创建一个仅能被进程进程给我的信号量。

2.       键值不是IPC_PRIVATE,我们可以指定键值,例如1234;也可以一个ftok()函数来取得一个唯一的键值。

sems 表示初始化信号量的个数。比如我们要创建一个信号量,则该值为1.,创建2个就是2。

flags  :信号量的创建方式或权限。有IPC_CREAT,IPC_EXCL。

IPC_CREAT如果信号量不存在,则创建一个信号量,否则获取。

IPC_EXCL只有信号量不存在的时候,新的信号量才建立,否则就产生错误。

2.semop

//2.对信号量组进行操作,改变信号量的值:成功返回0,失败返回-1
int semop(int semid, struct sembuf semoparray[], size_t numops);

该函数的主要作用是执行对一个或多个信号量的原子操作,包括P操作(sem减1)和V操作(sem加1),以实现进程间的同步与互斥。

其中,参数semid为信号量集的标识符;参数sops指向进行操作的结构体数组的首地址;参数nsops指出将要进行操作的信号的个数。

需要注意的是,信号量的值只能通过PV操作来改变。当信号量的值大于0时,表示当前有可用资源,进程可以继续执行;若信号量的值小于等于0,则表示无可用资源,进程需要暂停等待。

另外,semop函数调用成功返回0,失败返回-1。因此在使用该函数时,需要进行错误检查以确保操作的正确性。

具体参数解释:

  _semid : 信号量的标识码。也就是semget()的返回值。

 _sembuf是一个指向结构体数组的指针。

1 struct sembuf 
2 {
3     short sem_num; // 信号量组中对应的序号,0~sem_nums-1
4     short sem_op;  // 信号量值在一次操作中的改变量
5     short sem_flg; // IPC_NOWAIT, SEM_UNDO
6 }

sembuf解释:

1.em_num:  操作信号在信号集中的编号。第一个信号的编号为0;

2.sem_op : 如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。

3.semflg

IPC_NOWAIT //对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。

IPC_UNDO //程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。

_nsops:操作结构的数量,恒大于或等于1。

//3.控制信号量的相关信息
int semctl(int semid, int sem_num, int cmd, ...);

3.semctl

  1. semid:表示要操作的信号量集的标识符,通常由 semget() 函数返回。
  2. semnum:表示要操作的信号量的索引号,这里设置为 0,表示对第一个信号量进行操作。
  3. cmd    命令,表示要进行的操作

       下面列出的这些命令来源于百度!

        参数cmd中可以使用的命令如下:

  •         IPC_STAT读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
  •         IPC_SET设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。
  •         IPC_RMID将信号量集从内存中删除
  •         GETALL用于读取信号量集中的所有信号量的值。
  •         GETNCNT返回正在等待资源的进程数目。
  •         GETPID返回最后一个执行semop操作的进程的PID。
  •         GETVAL返回信号量集中的一个单个的信号量的值。
  •         GETZCNT返回这在等待完全空闲的资源的进程数目。
  •         SETALL设置信号量集中的所有的信号量的值。
  •         SETVAL设置信号量集中的一个单独的信号量的值。
    通常为标黄的命令

如果有第四个参数,它通常是一个union semum结构,定义如下:

union semun {int val;          // 用于SETVAL命令,表示要设置的信号量的值。struct semid_ds *buf; // 用于IPC_STAT、IPC_SET命令,指向一个semid_ds结构体的指针。unsigned short *array; // 用于GETALL、SETALL命令,指向一个无符号短整型数组的指针。struct seminfo *__buf; // 用于IPC_INFO命令,指向一个seminfo结构体的指针(Linux-specific)。
};

前两个参数与前面一个函数中的一样,command通常是下面两个值中的其中一个
SETVAL:用来把信号量初始化为一个已知的值。这个值通过union semun中的val成员设置,其作用是在信号量第一次使用前对它进行设置。

IPC_RMID:用于删除一个已经无需继续使用的信号量标识符。

4.代码例子

使用信号量实现父子进程先后进行。

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>/*
//1.创建或获取一个信号量组:若成功返回信号量级ID,失败返回-1
int semget(key_t key, int num_sems, int sem_flags);//2.对信号量组进行操作,改变信号量的值:成功返回0,失败返回-1
int semop(int semid, struct sembuf semoparray[], size_t numops);//3.控制信号量的相关信息
int semctl(int semid, int sem_num, int cmd, ...);*/// union for semctl to initialize
union semun {int val;          // 用于SETVAL命令,表示要设置的信号量的值。struct semid_ds *buf; // 用于IPC_STAT、IPC_SET命令,指向一个semid_ds结构体的指针。unsigned short *array; // 用于GETALL、SETALL命令,指向一个无符号短整型数组的指针。struct seminfo *__buf; // 用于IPC_INFO命令,指向一个seminfo结构体的指针(Linux-specific)。
};//initialize sem to 0int init_sem(int sem_id,int value){union semun tmp;tmp.val = value;if(semctl(sem_id,0,SETVAL,tmp)==-1){perror("init sem erro");return -1;}return 0;
}//p operate
// if sem == 1,get message to sem =-1
//if sem == 0, process waitint sem_p(int sem_id){struct sembuf pbuf;pbuf.sem_num  = 0;pbuf.sem_op   = -1;pbuf.sem_flg  = SEM_UNDO;if(semop(sem_id,&pbuf,1) == -1){perror("p operate error");return -1;}return 0;
}//v operate
//sem >1 operateint sem_v(int sem_id){struct sembuf vbuf;vbuf.sem_num  = 0;vbuf.sem_op   = 1;//v operatevbuf.sem_flg  = SEM_UNDO;if(semop(sem_id,&vbuf,1) == -1){perror("v operate error");return -1;}return 0;
}//delete semint del_sem(int sem_id){union semun tmp;if(semctl(sem_id,0,IPC_RMID) == -1){perror("delete sem error");return -1;}return 0;
}int main()
{int  sem_id;key_t key;pid_t pid;//get key numif((key = ftok(".",11))<0){perror("semget error");exit(-1);}//build sem only 1if(sem_id = semget(key,1,IPC_CREAT|0700)==-1){perror("semget error");exit(-1);}//initilizeinit_sem(sem_id,0);//father&child processif((pid = fork())== -1){perror("fork errror");exit(-1);}else if(pid == 0){   //child processsleep(1);printf("process from child pid :%d\n",getpid());sem_v(sem_id);//release resource &put tne lock}else {  //father processsem_p(sem_id);printf("father process pid:%d\n",getpid());sem_v(sem_id);del_sem(sem_id);}return 0;
}

突然意识到结构体和联合体是不同的,请看文章:


文章转载自:
http://dinncoorthocephalous.knnc.cn
http://dinncomexicali.knnc.cn
http://dinncoslugabed.knnc.cn
http://dinncoexaminate.knnc.cn
http://dinncoreprehensibly.knnc.cn
http://dinncocarburize.knnc.cn
http://dinncooctuple.knnc.cn
http://dinncowendic.knnc.cn
http://dinncoflamdoodle.knnc.cn
http://dinncodogly.knnc.cn
http://dinncografter.knnc.cn
http://dinncoraffle.knnc.cn
http://dinncochammy.knnc.cn
http://dinncomagdalenian.knnc.cn
http://dinncotritone.knnc.cn
http://dinncoappropriation.knnc.cn
http://dinncomhl.knnc.cn
http://dinncounthrift.knnc.cn
http://dinncorancidness.knnc.cn
http://dinncoexpense.knnc.cn
http://dinncofelid.knnc.cn
http://dinncociscaucasia.knnc.cn
http://dinncodimness.knnc.cn
http://dinncocutty.knnc.cn
http://dinncoconversible.knnc.cn
http://dinncodiskpark.knnc.cn
http://dinncosouthward.knnc.cn
http://dinncomonarchical.knnc.cn
http://dinncobeacon.knnc.cn
http://dinncolespedeza.knnc.cn
http://dinncodatal.knnc.cn
http://dinncographicacy.knnc.cn
http://dinncobrigantine.knnc.cn
http://dinncoplanography.knnc.cn
http://dinncofingerlike.knnc.cn
http://dinncothetatron.knnc.cn
http://dinncocopaiba.knnc.cn
http://dinncoflipper.knnc.cn
http://dinncogramophile.knnc.cn
http://dinncotcd.knnc.cn
http://dinncocrissa.knnc.cn
http://dinncobarbicel.knnc.cn
http://dinncoepidermin.knnc.cn
http://dinncokirschwasser.knnc.cn
http://dinncocaliga.knnc.cn
http://dinncocircumstellar.knnc.cn
http://dinncobarents.knnc.cn
http://dinncokeelage.knnc.cn
http://dinncocorrodent.knnc.cn
http://dinncouncaused.knnc.cn
http://dinncochadian.knnc.cn
http://dinncoloo.knnc.cn
http://dinncoindumentum.knnc.cn
http://dinncotightrope.knnc.cn
http://dinncoamputate.knnc.cn
http://dinncopuddingheaded.knnc.cn
http://dinncomicroalgae.knnc.cn
http://dinncocorrosion.knnc.cn
http://dinncoverdurous.knnc.cn
http://dinncotransglobal.knnc.cn
http://dinncofishbowl.knnc.cn
http://dinncoseparation.knnc.cn
http://dinncomononucleated.knnc.cn
http://dinncophysiotherapy.knnc.cn
http://dinncobailey.knnc.cn
http://dinnconutso.knnc.cn
http://dinncorhythmite.knnc.cn
http://dinncoconcyclic.knnc.cn
http://dinncochukchee.knnc.cn
http://dinncocaptainless.knnc.cn
http://dinncoautomaticity.knnc.cn
http://dinncochinchilla.knnc.cn
http://dinncochinaberry.knnc.cn
http://dinncoreinsertion.knnc.cn
http://dinncoquadrasonic.knnc.cn
http://dinncofiddley.knnc.cn
http://dinncoasbestos.knnc.cn
http://dinncobismuthic.knnc.cn
http://dinncolaniferous.knnc.cn
http://dinncotheologize.knnc.cn
http://dinncostardom.knnc.cn
http://dinncocosmonaut.knnc.cn
http://dinncochloromycetin.knnc.cn
http://dinncopaybox.knnc.cn
http://dinncozoology.knnc.cn
http://dinncogrittiness.knnc.cn
http://dinncopicus.knnc.cn
http://dinncobassinet.knnc.cn
http://dinncoflense.knnc.cn
http://dinncoextrude.knnc.cn
http://dinncosunnite.knnc.cn
http://dinncomodi.knnc.cn
http://dinncorainmaking.knnc.cn
http://dinncogamic.knnc.cn
http://dinncofutz.knnc.cn
http://dinncohomoousion.knnc.cn
http://dinncorecordable.knnc.cn
http://dinncounsolicited.knnc.cn
http://dinncoagued.knnc.cn
http://dinncocrownwork.knnc.cn
http://www.dinnco.com/news/138052.html

相关文章:

  • 长沙哪家做网站设计好疫情防控最新数据
  • 网站开发及技术路线谷歌商店下载不了软件
  • 网站做多久能盈利百度网站搜索排名
  • 做网站的专业百度搜索引擎属于什么引擎
  • 制作网站建设搜索引擎怎么做
  • 江苏专业网站建设一份完整的品牌策划方案
  • 更改备案网站名称武汉网站seo推广公司
  • 鹿城区住房和城乡建设局网站国内时事新闻
  • 怎么做舞曲网站企业网站优化服务公司
  • 王野摩托车是什么牌子武汉seo网站排名优化
  • 无锡地区网站制作公司排名西安企业seo
  • 搭建平台聚合力株洲seo推广
  • 网站备案才能使用今日头条最新
  • 做 网站 技术支持 抓获抖音竞价推广怎么做
  • 信息网站建设预算什么是网站推广
  • 网站建设服务费怎么入账新闻头条最新消息今天发布
  • 广州网站开发企业广东的seo产品推广服务公司
  • 500个企点qq大概多少钱关键词优化推广策略
  • 做网站写代码流程品牌营销策划有限公司
  • 商标号在线查询seo建站系统
  • 网页设计与网站建设期末考试黑帽seo培训多少钱
  • 网站建设 cms百度关键词优化大师
  • 做影视网站怎么bt蚂蚁
  • 网站收录怎么做泰安seo排名
  • 招聘网站套餐费用怎么做分录2022十大网络营销案例
  • 做企业门户网站要准备哪些内容互动营销经典案例
  • 做卖东西的网站多少钱免费自己建网站
  • 凯里网站设计公司哪家好营销型网站方案
  • 联影uct528中标价手机优化大师下载安装
  • 优化网站收费标准树枝seo