精选文章

Android下使用TCPDUMP抓包Wireshark分析数据 如果想分析Android下某个APP的网络数据交互,需要在Android手机上抓包,最常用的抓包工具非tcpdump莫属,用tcpdump生成Wireshark识别的pcap文件,然后将pcap文件下载到电脑上,用电脑上的Wireshark加载pcap文件,通过Wireshark分析tcpdump抓取的数据。...

继续阅读

Mac下部署Android开发环境附加NDK 作为开发者,我们深有体会,不管是进行什么开发,为了部署开发环境,我们往往需要折腾很长时间、查阅很多资料才能完成,而且这次折腾完了,下次到了另一台新电脑上又得重新来过,整个部署过程记得还好,要是不记得又得重新开始,而且遇到Android这种GFW阻隔了开发资源下载链接的环境部署,又尤其浪费时间。所以这也是我写下这篇教程的初衷跟动力源泉,希望大家参考了这篇教程以后可以轻轻松松在Mac系统下将Android环境部署好。...

继续阅读

稍顯嚴肅的台中 坦白說,留在腦海中的台中影像並不多,來台灣之前在Booking上只訂到了台中的一家青旅,第一次住青旅有些不習慣,幹什麼都放不開。 同屋的一個男生是台灣人,不過一年中四分之三的時間在上海跟北京,這麼說來跟我還是比較有共同話題的。得之我準備花15天的時間環島,覺得太倉促了,他們大學時期花一個半月的時間也不見得能將台灣島給逛完。我只能無奈地表示,兩岸允許的簽證時間有限,自己的空閒時間更有限,只能用打卡式的旅行了,我深知正真地旅行應該慢下來,融入當地的環境,感受他們的風土人情,但第一次只能這樣作罷,以後換成民進黨上台,形勢會變成怎樣還不得而知,能否再過來還是個未知數。而我一向信奉的人生格言是秉燭夜遊,活在當下,所以,理解自己吧。...

继续阅读

為之留戀的新竹 來新竹之前本沒有對她有過高的期待,慢慢對她加分要從桃園火車站出發前往新竹開始。 在桃園火車站的候車月台上,有醒目的旅遊資料發放處,這上面的擺放的全是新竹的旅遊宣傳資料,關鍵的是資料做得非常簡潔易懂,而接下來一天的新竹之行就全部是依據這份寶典的指引來完成的。...

继续阅读

從桃園開始台灣之行 初到台灣恰逢華夏銀行系統升級,特意準備的華夏銀聯卡在桃園機場沒能派上用場,只好用建行在機場5000塊,算下來是很不划算的,但是沒辦法,誰叫我出機場就得花錢呢。 從機場打車到桃園的酒店,花了將近六百塊新台幣,到酒店時五點多,天已經漸亮了,洗漱完等到七點吃過早餐就開始補覺囉,一覺醒來已是中午,帶著換下來的衣服外出找自助洗衣店,順便覓食。...

继续阅读

  • Prev
  • Next

Linux下的信号及相关编程

文章分类 : C语言, Linux

一、kill –l 显示所有信号,linux下有64个

1) SIGHUP 2) SIGINT(ctrl+c) 3) SIGQUIT(ctrl+\) 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL(可靠地杀死进程) 10) SIGUSR1
11) SIGSEGV(使用非法内存地址产生的信号——段错误) 12) SIGUSR2 13) SIGPIPE 14) SIGALRM(设定时间结束,杀死进程) 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT(使已经中断的信号继续执行) 19) SIGSTOP(可靠地暂停进程) 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

二、注册信号调用函数signal( )

#include <signal.h>
typedef void (*sighandler_t)(int);//函数指针
sighandler_t signal(int signum, sighandler_t handler);//参数为一个int跟一个函数指针,返回上一次该信号的处理函数,错误返回为SIG_ERR;

sighandler_t还可以取其它值:
①SIG_IGN表示忽略sighandler_t
②SIG_DFL表示调用系统定义的默认处理
③sighandler_t表示捕捉相应信号(signum);

三、中断的系统调用

如若read系统调用已经接受并传送数据至应用程序缓冲区,但尚未接受到应用程序请求的全部数据,此时被中断,操作系统认为该系统调用失败,并将error设置为EINTR;为了帮助应用程序使其不必处理被中断的系统调用,4.2BSD映入了某些被中断系统调用的自动重启,包括ioctl、read、readv、write、writev、wait、waitpid。

四、可重入函数

主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。

五、发送信号

1、kill函数用于向某一给定进程或进程组发送信号

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);

pid>0,向进程为pid值的进程发送信号
pid=0,向与发送信号的进程有相同进程组号的进程发送信号
pid<0,向进程组号为pid绝对值的进程组发送信号
pid=-1,未定义

2、raise函数用于向一个进程自身发送信号

#include <signal.h>
int raise(int sig);

3、alarm函数用于设定时间片,是系统在一定时间后发送信号

#include <unistd.h>
unsigned int alarm(unsigned int seconds);

seconds表示到下一次产生信号前间隔的时间
alarm() returns the number of seconds remaining
每个进程只能有一个alarm

4、pause函数让进程休眠直至有信号唤醒它

#include <unistd.h>
int pause(void);

应用——写一个自己的sleep函数:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void alarm_hander(int s)
{
    return ;
}

unsigned int mysleep(unsigned int seconds)
{
    signal(SIGALRM, alarm_hander);
    alarm(seconds);
    pause();//进程休眠
    return alarm(0);//alarm(0)信号唤醒进程,同时alarm返回上次
}

int main(void)
{
    printf("begin...\n");
    unsigned int ret = mysleep(5);
    printf("after %d seconds\n",5-ret);
    return 0;
}
输出结果:
begin...
(过了5秒输出下一条)
after 5 seconds

除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。

本文地址:https://www.cpplive.com/html/739.html

这里因为你的留言而存在!!!

You must be logged in to post a comment.