linux 进程信号量(shell查看进程)

其实linux 进程信号量的问题并不复杂,但是又很多的朋友都不太了解shell查看进程,因此呢,今天小编就来为大家分享linux 进程信号量的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

linux常用信号量

linux的常用信号量

BUS与SEGV

二者都是错误信号,BUS表示总线错误,SEGV表示段错误,程序崩溃的时候99%都是这两个错误导

致的。进程可以捕获和封锁这两类错误。内核对二者的默认处理是memory dump

WINCH

窗口改变信号(WINdown CHanged)。例如虚拟终端的行数发生变化时将发送WINCH信号,绝大多数

文本编辑器都能捕获WINCH信号自动进行重新配置。内核的默认处理是忽略该信号,并且不进行内存

转储。

进程可以捕获或者封锁该信号

KILL

杀死/删除进程,编号为9

STOP

挂起/暂停正在执行的进程,直到收到CONT为止

KILL STOP都不能够被捕获、封锁或者忽略,默认处理都不会产生内存转储。

CONT

取消挂起,继续执行进程

TSTP

是STOP信号的“软”版本,即在用户输入Ctrl+Z时由终端驱动程序发送的信号。捕获到该信号的进程通常

清除它们的状态,如何给自己发送一个STOP信号。TSTP的默认处理不会导致内存转储。

INT

中断信号,编号为2

当用户输入Ctrl+C时由终端驱动程序发送INT信号

INT信号是终止当前操作的请求,简单程序捕获到INT信号时应该退出,拥有命令行或者输入模式的那些

程序应该停止他们正在做的事情,清除状态,并等待用户再次输入。

TERM

软件终止信号,编号为15

TERM是请求彻底终止某项操作的信号,它期望进程清楚自己的状态并退出

QUIT

退出信号,编号为3

与TERM类似,不同之处在于QUIT信号的默认处理是内存转储,而TERM信号的默认处理没有内存转储。

HUP

挂起信号,编号为1,有两种解释:

守护进程理解HUP为重新设置的请求,如果守护进程能够不用重新启动就能够重新读取它自己的配置文

件并调整自己以适应变化的话,那么HUP信号通常可以用来触发这种行为

HUP

信号有时有终端驱动程序生成,试图用来清除(也就是终止)跟某个特定终端相连接的那些进程。例如

当一个终端会话结束时,或者当一个Modem的连接不经意的断开时,就可能出现这种情况。

如果需要某些进程在会话结束之后继续运行,那么在C Shell中设法让这些进程变成后台程序,

ksh或者bash中可以用nohup来模拟这种行为。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

进程的四种状态

runnable(可运行状态)

只要有CPU时间,进程就可以执行。一旦进程执行了不能立即完成的系统调用,Linux会把进程转入

睡眠状态

sleeping(睡眠状态)

进程在等待某些事件发生(如终端输入、网络连接)

zombie(僵化状态)

进程已经执行完毕并试图消亡,但是状态没有收集完

stopped(停止状态)

进程被挂起,不允许执行。进程收到STOP或者TSTP信号即进入停止状态,可以用CONT信号来重新启动

c语言实例,linux线程同步的信号量方式 谢谢

这么高的悬赏,实例放后面。信号量(sem),如同进程一样,线程也可以通过信号量来实现通信,虽然是轻量级的。信号量函数的名字都以"sem_"打头。线程使用的基本信号量函数有四个。

信号量初始化。

intsem_init(sem_t*sem,intpshared,unsignedintvalue);

这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。

等待信号量。给信号量减1,然后等待直到信号量的值大于0。

intsem_wait(sem_t*sem);

释放信号量。信号量值加1。并通知其他等待线程。

intsem_post(sem_t*sem);

销毁信号量。我们用完信号量后都它进行清理。归还占有的一切资源。

intsem_destroy(sem_t*sem);

#include<stdlib.h>

#include<stdio.h>

#include<unistd.h>

#include<pthread.h>

#include<semaphore.h>

#include<errno.h>

#definereturn_if_fail(p)if((p)==0){printf("[%s]:funcerror!/n",__func__);return;}

typedefstruct_PrivInfo

{

sem_ts1;

sem_ts2;

time_tend_time;

}PrivInfo;

staticvoidinfo_init(PrivInfo*thiz);

staticvoidinfo_destroy(PrivInfo*thiz);

staticvoid*pthread_func_1(PrivInfo*thiz);

staticvoid*pthread_func_2(PrivInfo*thiz);

intmain(intargc,char**argv)

{

pthread_tpt_1=0;

pthread_tpt_2=0;

intret=0;

PrivInfo*thiz=NULL;

thiz=(PrivInfo*)malloc(sizeof(PrivInfo));

if(thiz==NULL)

{

printf("[%s]:Failedtomallocpriv./n");

return-1;

}

info_init(thiz);

ret=pthread_create(&pt_1,NULL,(void*)pthread_func_1,thiz);

if(ret!=0)

{

perror("pthread_1_create:");

}

ret=pthread_create(&pt_2,NULL,(void*)pthread_func_2,thiz);

if(ret!=0)

{

perror("pthread_2_create:");

}

pthread_join(pt_1,NULL);

pthread_join(pt_2,NULL);

info_destroy(thiz);

return0;

}

staticvoidinfo_init(PrivInfo*thiz)

{

return_if_fail(thiz!=NULL);

thiz->end_time=time(NULL)+10;

sem_init(&thiz->s1,0,1);

sem_init(&thiz->s2,0,0);

return;

}

staticvoidinfo_destroy(PrivInfo*thiz)

{

return_if_fail(thiz!=NULL);

sem_destroy(&thiz->s1);

sem_destroy(&thiz->s2);

free(thiz);

thiz=NULL;

return;

}

staticvoid*pthread_func_1(PrivInfo*thiz)

{

return_if_fail(thiz!=NULL);

while(time(NULL)<thiz->end_time)

{

sem_wait(&thiz->s2);

printf("pthread1:pthread1getthelock./n");

sem_post(&thiz->s1);

printf("pthread1:pthread1unlock/n");

sleep(1);

}

return;

}

staticvoid*pthread_func_2(PrivInfo*thiz)

{

return_if_fail(thiz!=NULL);

while(time(NULL)<thiz->end_time)

{

sem_wait(&thiz->s1);

printf("pthread2:pthread2gettheunlock./n");

sem_post(&thiz->s2);

printf("pthread2:pthread2unlock./n");

sleep(1);

}

return;

}

linux 信号量是什么怎么用

Linux信号量(semaphore)是一种互斥机制。即对某个互斥资源的访问会收到信号量的保护,在访问之前需要获得信号量。

在操作完共享资源后,需释放信号量,以便另外的进程来获得资源。获得和释放应该成对出现。

获得信号量集,需要注意的是,获得的是一个集合,而不是一个单一的信号量。

#include

#include

#include

1: int semget(key_t key,int nsems,int semflg);

key:系统根据这个值来获取信号量集。

nsems:此信号集包括几个信号量。

semflg:创建此信号量的属性。(IPC_CREAT| IPC_EXCL| S_IRUSR| S_IWUSR)

成功则返回该信号量集的ID。

注:

既指定IPC_CREAT又指定IPC_EXCL时,如果系统中该信号量集已经存在,则马上返回。

如果需要获得存在的信号量,则将此参数置0.

2: int semctl(int semid,int senum,int cmd....)

semid:信号量ID。

senum:对信号量集中的第几个信号量进行控制。(从0开始)

cmd:需要进行的操作。(SETVAL是其中的一个)。

根据cmd的不同可能存在第四个参数,cmd=SETVAL时,表示同时信号量可以被获得几次,如第四个参数

num=1表示只能被获得一次,既被信号量保护的资源只能同时被一个程序使用。

该系统调用,是在对信号量初始化时用的。

-3:“3”前面加了"-"表示当需要使用互斥资源时应该做这步。

int semop(int semid,struct sembuf*sem,int num_elements);

struct sembuf{

unsigned short sem_num;//该信号量集中的第几个信号量。

int sem_op;//需要获得还是释放信号量

int sem_flg;//相关动作

};

num_elements:需要对该信号量集中的多少个信号量进行处理。

获得信号量时,将sembuf结构提初始化为:

sem_num= 0;//该信号量集中的首个信号量

sem_op=-1;//获得信号量

sem_flag= IPC_NOWAIT;//如果不能获得信号量,马上返回。

semop(semid,_sem,1);

同理释放信号量时,将sem_op设为1.

以上是对信号量的简单处理

阅读剩余
THE END