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

欧亚专线快递查询/如何优化网站推广

欧亚专线快递查询,如何优化网站推广,沈阳关键词排名首页,现在币圈有那些私募网站做的好一、信号量概述 Linux是一个多进程操作系统,因此会存在进程间争夺有限资源(如硬件资源和软件资源)的情况,这种情况称为竞态,进程之间的关系称为互斥关系。 信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信…

一、信号量概述

        Linux是一个多进程操作系统,因此会存在进程间争夺有限资源(如硬件资源和软件资源)的情况,这种情况称为竞态,进程之间的关系称为互斥关系。

        信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及堆信号量进行的两个原子操作(PV操作)。其中信号量对应于某一种资源,取一个非负的整数值。信号量值指的是当前可用的该资源的数量,若它等于0则意味着目前没有可用的资源。PV原子操作的具体定义如下:

PV原子操作具体定义
P操作:如果有可用的资源(信号量值>0),则占用一个资源(给信号量值减去一,进入临界区代码);如果没有可用的资源(信号量值等于0),则被阻塞到,直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)
V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程。如果没有进程等待它,则释放一个资源(给信号量值加一)。

二、信号量的应用

(1)函数说明

         在Linux系统中,使用信号量通常分为以下几个步骤:

(1)  创建信号量或获得在系统已存在的信号量,此时需要调用semget()。不同进程通过使用同一个信号量键值来获得同一个信号量。
(2)  初始化信号量,此时使用semctl()函数的SETVAL操作。当使用二维信号量时,通常将信号量初始化为1.
(3)  进行信号量的PV操作,此时调用semop()函数。这一步是实现进程之间的同步和互斥的核心工作部分。
(4)  如果不需要信号量,则从系统中删除它,此时使用semctl()函数的IPC_RMID操作。此时需要注意,在程序中不应该出现对已经被删除的信号量的操作。

(2)函数格式

semget()函数语法要点
所需头文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

函数原型int semget(key_t key,int nsems,int semflg)
函数传入值key:信号量的键值,多个进程可以通过它访问同一个信号量,其中有一个特殊值IPC_PRIVATE。它用于创建当前进程的私有信号量。
nsems:需要创建的信号量数目,通常取值为1
semflg:同open()函数的权限位,也可以用八进制表示,其中使用IPC_CREAT标志创建新的信号量,即使该信号量已经存在(具有同一键值的信号量已在系统中存在),也不会出错。如果同时使用IPC_EXCL标志可以创建一个新的唯一的信号量,此时如果该信号量已存在,该函数会返回出错。
函数返回值成功:信号量标识符,在信号量的其他函数中都会使用该值
出错:-1
semctl()函数语法要点
所需头文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

函数原型int semctl(int semid,int semnum,int cmd,union semun arg)
函数传入值semid:semget()函数返回的信号量标志符
semnum:信号量编号,当使用信号量集时才会被用到。通常取值为0,就是使用单个信号量(也就是第一个信号量)

cmd:指定对信号量的各种操作,当使用单个信号量(而不是信号量集)时,常用的有以下几种:

IPC_STAT:获得该信号量(或者信号量集合)的semid_ds结构,并存放在由第4个参数arg的buf指向的semid_ds结构中。semid_ds是在系统中描述信号量的数据结构

IPC_SETVAL:将信号量值设置为arg的val值

IPC_GETVAL:返回信号量的当前值

IPC_RMID:从系统中,删除信号量(或者信号量集)

arg:是union semun结构,该结构可能会在某些系统中并不给出定义,此时必须由程序员自己定义

union semun

{

     int val;

     struct semid_ds *buf;

     unsigned short *array;

}

函数返回值

成功:根据cmd值得不同而返回不同的值

IPC_STAT、IPC_SETVAL、IPC_RMID:返回0

IPC_GETVAL:返回信号量当前值

出错:-1
semop()函数语法要点
所需头文件

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

函数原型int smeop(int semid,struct sembuf *sops,size_t nsops)
函数传入值semid:semget()函数返回的信号量标识符

sops:指向信号量操作数组,一个数组包括以下成员:

struct sembuf

{

    short sem_num;  /* 信号量编号,使用单个信号量时,通常取值为0 */

    short sem_op;     /* 信号量操作:取值为-1表示P操作,取值为+1表示V操作 */

    short sem_flg;     /* 通常设置为SEM_UNDO。这样在进程没有释放信号量而退出时,系统自动释放该进程中未释放                                     的信号量 */

}

nsops:操作数组sops中的操作个数(元素数目),通常取值为1(一个操作)
函数返回值成功:信号量标识符,在信号量的其他函数中都会使用该值
出错:-1

(3)使用实例

sem_com.h

/* sem_com.h */
#ifndef _SEM_COM_H_
#define _SEM_COM_H_union semun
{int val;struct semid_ds *buf;unsigned short *array;
};int sem_init(int sem_id,int init_value);
int sem_del(int sem_id);
int sem_p(int sem_id);
int sem_v(int sem_id);#endif

sem_com.c

/* sem_com.c */
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include "sem_com.h"int sem_init(int sem_id,int init_value)
{union semun sem_union;sem_union.val = init_value;if(semctl(sem_id,0,SETVAL,sem_union) == -1){perror("Initialize semaphore");return -1;}return 0;
}int sem_del(int sem_id)
{union semun sem_union;if(semctl(sem_id,0,IPC_RMID,sem_union) == -1){perror("Delete semaphore");return -1;}return 0;
}int sem_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){perror("P operations");return -1;}return 0;
}int sem_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){perror("V operations");return -1;}return 0;
}

sem_fork.c主程序

/* sem_fork.c */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "sem_com.h"int main(void)
{pid_t pid;int sem_id,i;sem_id = semget((key_t)1234,1,0666|IPC_CREAT);if(sem_id < 0){printf("semget error.\n");exit(1);}sem_init(sem_id,0);pid = fork();if(pid == -1){printf("fork error.\n");exit(1);}else if(pid == 0){printf("Child %d:\n",getpid());for(i=0;i<3;i++){printf("sleep:%d\n",i);sleep(1);}sem_v(sem_id);exit(0);}else{sem_p(sem_id);printf("Parent %d.\n",getpid());sem_v(sem_id);sem_del(sem_id);exit(0);}
}

 

http://www.jmfq.cn/news/5020669.html

相关文章:

  • 平面设计培训素材/优化方案怎么写
  • 怎么免费建自己的网站/搜索引擎推广培训
  • 智慧团建学生登录入口官网/广州seo技术优化网站seo
  • 南通市港闸区城乡建设局网站/互联网营销成功案例
  • 中铁建设集团公司门户/seo查询系统源码
  • 辽宁省城乡住房和建设厅网站/免费做网站怎么做网站链接
  • 婚庆网站建设/成都网站关键词推广
  • wordpress企业模板破解/网站优化公司推荐
  • 武汉网站建设的有哪些公司/google安卓手机下载
  • 国内阿里网站建设/最新营销模式有哪些
  • 太原网站建设优化/今日舆情热点
  • 网站没备案会怎么样/沈阳seo排名优化推广
  • 企业官网建站系统/国内最好的搜索引擎
  • 动态网站开发工程师 asp/网上推广怎么收费
  • 网站单页推广/新媒体营销成功案例
  • 没网站做推广/什么平台可以打广告做宣传
  • 个人工作室经营范围/福建seo优化
  • 武汉建立网站营销设计/中央下令全国各地核酸检测
  • 邯郸事件最新消息新闻/班级优化大师的利和弊
  • 蚌埠网站制作/软文广告经典案例短的
  • 博彩导航网站可以做吗/公司seo是指什么意思
  • 百度网站怎么做的/推广网页
  • 网站建设的资金风险/免费建一个自己的网站
  • 焦作做网站推广/网站推广优化方式
  • 平陆县做网站/江门网站定制多少钱
  • 南头专业的网站建设公司/网页宣传
  • 福州金山网站建设/百度推广开户渠道
  • 巩义网站建设/软文发布推广平台
  • 配色相关网站/短视频培训
  • 营销型网站建设技术指标/西安seo排名收费