linux c 信号量(如何在linux系统编写c)

大家好,今天来为大家解答linux c 信号量这个问题的一些问题点,包括如何在linux系统编写c也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

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下 信号量初值是多少

1.在UNIX的System V中,信号量通常被认为是对资源的访问,因此资源可用则用正整数表示,当资源被全部占用,则为零。

2.在不同的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信号来重新启动

阅读剩余
THE END