导航:首页 > 网络营销 > sem的信号

sem的信号

发布时间:2020-10-15 08:56:14

1、在ucos中创建一个信号量 比如ossemcreat(0)。ossemcreat(1)的区别

OSSemPost 和OSSemPend是成对出现的,在程序OSSemPost 尚未运行到的时候,在等待Sem的
OSSemPend是会把当前的任务挂起,直到另外一个任务的OSSemPost 运行完毕都得到Sem。但是可以通过改变OSSemCreate(x)里面的值x改变这种局面,当x不为0时,OSSemPend会马上得到Sem继续运行当前任务至结束,并将x的数值减一,直到为0。为0后,只有等其他任务的OSSemPost了。

2、FTIR和SEM是什么?

FTIR是指红外光谱仪器的第三代傅立叶变换红外吸收光谱仪(FTIR)。SEM是1965年发明的较现代的细胞生物学研究工具扫描电子显微镜。

3、信号量的使用,求助

信号量:一个整数;
大于或等于0时代表可供并发进程使用的资源实体数;
小于0时代表正在等待使用临界区的进程数;
用于互斥的信号量初始值应大于0;
只能通过P、V原语操作而改变;
信号量元素组成:
1、表示信号量元素的值;
2、最后操作信号量元素的进程ID
3、等待信号量元素值+1的进程数;
4、等待信号量元素值为0的进程数;

二、主要函数

1.1 创建信号量
int semget(
key_t key, //标识信号量的关键字,有三种方法:1、使用IPC——PRIVATE让系统产生,
// 2、挑选一个随机数,3、使用ftok从文件路径名中产生
int nSemes, //信号量集中元素个数
int flag //IPC_CREAT;IPC_EXCL 只有在信号量集不存在时创建
)
成功:返回信号量句柄
失败:返回-1

1.2 使用ftok函数根据文件路径名产生一个关键字
key_t ftok(const char *pathname,int proj_id);
路径名称必须有相应权限

1.3 控制信号量
int semctl(
int semid, //信号量集的句柄
int semnum, //信号量集的元素数
int cmd, //命令
/*union senum arg */... //
)
成功:返回相应的值
失败:返回-1

命令详细说明:
cmd: IPC_RMID 删除一个信号量
IPC_EXCL 只有在信号量集不存在时创建
IPC_SET 设置信号量的许可权
SETVAL 设置指定信号量的元素的值为 agc.val
GETVAL 获得一个指定信号量的值
GETPID 获得最后操纵此元素的最后进程ID
GETNCNT 获得等待元素变为1的进程数
GETZCNT 获得等待元素变为0的进程数

union senum 定义如下:
union senum{
int val;
struct semid_ds *buf;
unsigned short * array;
}agc;
其中 semid_ds 定义如下:
struct semid_ds{
struct ipc_pem sem_pem; //operation pemission struct
time_t sem_otime; //last semop()time
time_t sem_ctime; //last time changed by semctl()
struct sem *sembase; //ptr to first semaphore in array
struct sem_queue *sem_pending; //pending operations
struct sem_queue *sem_pending_last; //last pending operations
struct sem_undo *undo; //undo requests on this arrary
unsigned short int sem_nsems; //number of semaphores in set
};

1.4 对信号量 +1 或 -1 或测试是否为0
int semop(
int semid,
struct sembuf *sops, //指向元素操作数组
unsigned short nsops //数组中元素操作的个数
)

结构 sembuf 定义
sembuf{
short int sem_num; //semaphore number
short int sem_op; //semaphore operaion
short int sem_flg //operation flag
};

三、例子:
2.1 服务器

#include <sys/sem.h>
#include <sys/ipc.h>

#define SEGSIZE 1024
#define READTIME 1
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
//生成信号量
int sem_creat(key_t key)
{
union semun sem;
int semid;
sem.val = 0;
semid = semget(key,1,IPC_CREAT|0666);
if (-1 == semid){
printf("create semaphore error\n");
exit(-1);
}
semctl(semid,0,SETVAL,sem);
return semid;
}
//删除信号量
void del_sem(int semid)
{
union semun sem;
sem.val = 0;
semctl(semid,0,IPC_RMID,sem);
}

//p
int p(int semid)
{
struct sembuf sops={0,+1,IPC_NOWAIT};
return (semop(semid,&sops,1));
}
//v
int v(int semid)
{
struct sembuf sops={0,-1,IPC_NOWAIT};
return (semop(semid,&sops,1));
}
int main()
{
key_t key;
int shmid,semid;
char *shm;
char msg[7] = "-data-";
char i;
struct semid_ds buf;

key = ftok("/",0);
shmid = shmget(key,SEGSIZE,IPC_CREAT|0604);
if (-1 == shmid){
printf(" create shared memory error\n");
return -1;
}
shm = (char *)shmat(shmid,0,0);
if (-1 == (int)shm){
printf(" attach shared memory error\n");
return -1;
}
semid = sem_creat(key);
for (i = 0;i <= 3;i++){
sleep(1);
p(semid);
sleep(READTIME);
msg[5] = '0' + i;
memcpy(shm,msg,sizeof(msg));
sleep(58);
v(semid);
}
shmdt(shm);
shmctl(shmid,IPC_RMID,&buf);
del_sem(semid);
return 0;
//gcc -o shm shm.c -g
}

2.2 客户端

#include <sys/sem.h>
#include <time.h>
#include <sys/ipc.h>

#define SEGSIZE 1024
#define READTIME 1
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;

// 打印程序执行时间
void out_time(void)
{
static long start = 0;
time_t tm;
if (0 == start){
tm = time(NULL);
start = (long)tm;
printf(" now start ...\n");
}
printf(" second: %ld \n",(long)(time(NULL)) - start);
}

//创建信号量
int new_sem(key_t key)
{
union semun sem;
int semid;
sem.val = 0;
semid = semget(key,0,0);
if (-1 == semid){
printf("create semaphore error\n");
exit(-1);
}
return semid;
}

//等待信号量变成0
void wait_v(int semid)
{
struct sembuf sops={0,0,0};
semop(semid,&sops,1);
}

int main(void)
{
key_t key;
int shmid,semid;
char *shm;
char msg[100];
char i;

key = ftok("/",0);
shmid = shmget(key,SEGSIZE,0);

if(-1 == shmid){
printf(" create shared memory error\n");
return -1;
}
shm = (char *)shmat(shmid,0,0);
if (-1 == (int)shm){
printf(" attach shared memory error\n");
return -1;
}
semid = new_sem(key);
for (i = 0;i < 3;i ++){
sleep(2);
wait_v(semid);
printf("Message geted is: %s \n",shm + 1);
out_time();
}
shmdt(shm);
return 0;
// gcc -o shmc shmC.c -g
}

4、扫描电镜sem主要探测的型号强弱与材料什么物理量有关

1、二次电子探测器:材料元素原子序数越大,激发出的信号越少,信号强度越低,表现出电镜图像越暗
2、背散射电子探测器:材料元素原子序数越大,激发出的信号强度越高,表现出电镜图像越亮
3、能谱仪:材料不同元素激发出特征X射线,收集时间越长,累积的强度越大

5、怎么修改linux中sem的值

有3个方法
#在控制台上输入

bash$ mysql -u root mysql

#用mysql客户程序

mysql> UPDATE user SET

6、SEM如何利用二次电子成像

从书上查了一些内容,书的年代比较久远,可能买不到...有兴趣的话,尝试着去图书馆借一下吧。
SEM工作时,电子枪发射的入射电子束打在试样表面上,向内部穿透一定的深度,由于弹性和非弹性散射形成一个呈梨状的电子作用体积。电子与试样作用产生的物理信息,均由体积内产生。
二次电子是入射电子在试样内部穿透和散射过程中,将原子的电子轰击出原子系统而射出试样表面的电子,其中大部分属于价子激发,所以能量很小,一般小于50eV。因此二次电子探测体积较小。二次电子发射区的直径仅比束斑直径稍大一些,因而可获得较高的分辨率。
二次电子像的衬度取决于试样上某一点发射出来的二次电子数量。电子发射区越接近表面,发射出的二次电子就越多,这与入射电子束与试样表面法线的夹角有关。试样的棱边、尖峰等处产生的二次电子较多,相应的二次电子像较亮;而平台、凹坑处射出的二次电子较少,相应的二次电子像较暗。根据二次电子像的明暗衬度,即可知道试样表面凹凸不平的状况,二次电子像是试样表面的形貌放大像。
SEM内在试样的斜上方放置有探测器来接受这些电子。接受二次电子的装置简称为检测器,它是由聚焦极、加速极、闪烁体、光导管和光电倍增管组成。在闪烁体前面装一筒装电极,称为聚焦极,又称收集极。在其前端加一栅网,在聚焦极上加250-300V的正电压。二次电子被此电压吸引,然后又被带有10kV正电压的加速极加速,穿过网眼打在加速极的闪烁体上,产生光信号,经光导管输送到光电倍增管,光信号转变为电子信号。最后输送到显示系统,显示出二次电子像。

7、计算机*作系统中,若P、V*作的信号量S初值为2,当前值为-1,则表示有____个等待进程

有1个等待进程。

信号量(Semaphore),是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。

为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。初值为2,表示初始时有两个可用的资源。现在为-1,就说明这两个可用资源已经被占用了,有一个进程还在等待资源。

(7)sem的信号扩展资料:

对信号量有4种操作(#include<semaphore.h>):

1、 初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value);

2、等信号(wait),也可叫做挂起(suspend)int sem_wait(sem_t *sem);

3、给信号(signal)或发信号(post) int sem_post(sem_t *sem);

4、清理(destroy) int sem_destory(sem_t *sem)。

与sem的信号相关的知识