国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

提供網站建設價格產品seo怎么優(yōu)化

提供網站建設價格,產品seo怎么優(yōu)化,網站目錄是什么,做公司網站哪里好一.什么是信號 生活中,有哪些信號相關的場景呢,比如:紅綠燈,鬧鐘,轉向燈等等 1.這里我們要知道,你為什么認識這些信號呢,記住了對應場景下的信號+后續(xù)是有”動作“要你執(zhí)行的 2.我們…

一.什么是信號

生活中,有哪些信號相關的場景呢,比如:紅綠燈,鬧鐘,轉向燈等等

1.這里我們要知道,你為什么認識這些信號呢,記住了對應場景下的信號+后續(xù)是有”動作“要你執(zhí)行的

2.我們在我們的大腦中,能夠識別這個信號的

3.如果特定信號沒有產生,但是我們依舊知道應該如何處理這個信號

4.我在收到這個信號的時候,可能不會立即處理這個信號

5.信號本身,在我們無法立即被處理的時候,也一定要先被臨時的記住

?結論:什么是Linux信號,本質是一種通知機制,用戶or操作系統(tǒng)通過發(fā)送一定的信號,通知進程,某些事件已經發(fā)生,你可以在后續(xù)進行處理。

二.信號如何使用,結合進程,信號結論

1.進程要處理信號,必須具備信號“識別”的能力(看到+處理動作)

2.憑什么進程能夠“識別”信號呢,代碼是程序員編寫的,就比如說你是如何認識紅綠燈的,這都是有人告訴你的

3.信號產生是隨機的,進程可能正在忙自己的事情,所以,信號的后續(xù)處理,可能不是立即處理的

4.進程會臨時的記錄下對應的信號,方便后續(xù)進行處理

5. 在什么時候處理呢,合適的時候(這個后面會說)

6.一般而言,信號的產生相對于進程而言是異步的(什么是異步呢,異步雙方不需要共同的時間,也就是接收方不知道發(fā)送方什么時候發(fā)送,所以在發(fā)送的信息中就要有提示接收方開始接收的信息,如開始時有開始位,同時在結束時有停止位。)

三.信號常見的處理方式

1.默認(進程自帶的,程序員寫好的邏輯)

2.忽略(信號的一種處理方式)

3.自定義動作(捕捉信號)

四.常見信號

?1-31普通信號,34-64實時信號。

如何理解組合鍵變信號:鍵盤的工作方式是通過:中斷方式進行的,當然也能夠識別組合鍵,ctrl+c,OS解釋組合鍵->查找進程列表->前臺運行的進程->OS寫入對應的信號到進程內部的位圖結構中。?

如何理解信號被進程保存:進程必須具有保存信號的相關數(shù)據結構(位圖,unisgned int)PCB內部保存了信號位圖字段。

如何理解信號發(fā)送的本質:信號位圖是在task_struct -> task_struct內核數(shù)據結構->OS。

信號發(fā)送的本質:OS向目標進程寫信號,OS直接修改pcb中的指定的位圖結構完成“發(fā)送”信號的過程。

五.信號的產生以及核心轉儲

?鍵盤產生信號

?sighandler_t handler回調函數(shù),通過回調的方式,修改對應信號的捕捉方法,signum,要捕捉信號的名稱或編號。

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
using namespace std;void cating(int signum)
{cout<<"捕捉到信號:"<<signum<<endl;return;
}int main()
{signal(2,cating);while(1)sleep(1);return 0;
}

signal(SIGINT,catchsig),特定信號的處理動作,一般只有一個,signal函數(shù),僅僅是修改進程對特定信號的后續(xù)處理動作,不是直接調用對應的處理動作,如果后續(xù)沒有任何SIGINT信號產生,catchsig永遠也不會被調用。

核心轉儲

man 7 signal 查看信號的默認處理行為。這里不同信號的Action不同,有Term、Core、Ign、Cont、Stop等狀態(tài)行為。

接下來就是了解一下Core動作——核心轉儲(一般而言云服務器的核心轉儲功能是被關閉的)。關于進程等待中,status 中如果是正常終止就保存返回值、錯誤碼。

如果被信號所殺,第7位上保存的這個就叫做core dump,如果是0表示沒有發(fā)生核心轉儲,為1則是發(fā)生了核心轉儲。我們可以打印code_dump位的信息 (左移7位然后與上1即可)。?

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
using namespace std;void cating(int signum)
{cout<<"捕捉到信號:"<<signum<<endl;return;
}
int main()
{pid_t id = fork();if (id == 0){sleep(1);int a = 100;a /= 0;exit(0);}int status = 0;waitpid(id, &status, 0);cout << "父進程:" << getpid() << "子進程:" << getppid() << endl;//退出信號:cout << "exit sig" << (status & 0x7f) << endl;// 打印core dump位cout << "core dump" << (status > 7 & 1) << endl;
}

如果核心轉儲是被關閉的,可以使用ulimit -a查看,ulimit -c10240打開,這里就可以使用core.11077就可以定位錯誤。

系統(tǒng)調用發(fā)送信號?

?第一個參數(shù)為指定的進程pid,第二個參數(shù)為對應的信號編碼。

kill 是給指定進程發(fā)送信號,而如果想讓自己給自己發(fā)信號,可以使用 raise 命令

給自己發(fā)送abort信號,也就是6號信號。相當于代碼:raise(6) 或 ?kill(getpid(),6)

軟件條件產生信號

這里可以舉一個例子:當管道,讀端不進行讀取,還關閉了文件描述符,而寫端一直寫入,會發(fā)生什么問題?操作系統(tǒng)會自動終止對應寫端進程,通過發(fā)送信號的方式,發(fā)送SIGPIPE信號。

?驗證:

1.創(chuàng)建匿名管道

2.讓父進程進行讀取,子進程進行寫入

3.讓父進程關閉讀端 && waitpid(),子進程一直進行寫入

4.子進程退出,父進程waitpid拿到子進程的退出status。

5.提取退出信號。

SIGPIPE便是一種軟件條件產生的信號,除了管道中會發(fā)出SIGPIPE信號,接下來我們學習其它軟件產生的信號,alarm 函數(shù)與SIGALRM 信號,系統(tǒng)調用中的?alarm 函數(shù)會產生 SIGALRM? 信號。接下來讓我們了解一下 alarm 接口。

調用 alarm 函數(shù)可以設定一個鬧鐘,也就是告訴內核再?seconds 秒之后給當前進程發(fā)?SIGALRM 信號,該信號的默認處理動作是終止當前進程。?

利用上面這個函數(shù),我們可以做一個定時器。

int count = 0;void catchSig(int signum)
{cout << "count: " << count << endl;
}
int main()
{// 1秒后發(fā)送消息alarm(1);signal(SIGALRM, catchSig);while (1){++count;}return 0;
}

如何理解軟件條件給進程發(fā)送信號OS先識別到某種軟件條件觸發(fā)或不滿足。OS構建信號,發(fā)送給指定的進程。

?硬件異常產生信號

?首先我們要知道硬件是如何產生信號的,我們先寫一段整數(shù)除以0的代碼看一下。

void handler(int signum)
{sleep(1);cout << "signal is : " << signum << endl;
}
int main()
{signal(SIGFPE, handler);int a;a/=0;while (1)sleep(1);return 0;
}

這段代碼會不斷的產生信號8,但是我們把信號8捕捉了,他就會不停的發(fā)送。

一.那如何理解整數(shù)除以0這個操作

1.因為計算的是CPU,如果CPU計算出現(xiàn)錯誤,會將錯誤信息放入到狀態(tài)寄存器中,狀態(tài)寄存器中有對應的狀態(tài)標記位(類比成 位圖),其中會存在溢出標記位,OS會自動進行計算完畢之后的檢查。
2.如果OS識別到有溢出問題,根據 current指針(指向當前正在運行的進程) 找到進程,然后提取出 PID,O S再進行信號發(fā)送到該進程,進程則會再合適的時候,進行信號的處理。
3.立即找到當前 task_struct中有一個current指針,當程序進行執(zhí)行時,current內的內容也會被加載到CPU的寄存器中。
4.所以,整數(shù)除以零是一個硬件異常的問題。

二·.那一旦出現(xiàn)硬件異常,進程一定會退出嗎?

不一定,一般默認是退出,但是如果我們不進行退出,我們也不能進行任何操作,因為無權訪問CPU中的寄存器數(shù)據。

三.為什么會發(fā)生死循環(huán)?

因為寄存器中的異常一直沒有被解決,所以一般我們出現(xiàn)除0等錯誤,一般就直接exit()退出了。

指針越界、野指針一般被稱為段錯誤 (11號信號SIGSEGV)

那如何理解野指針或越界問題?

1.都必須通過地址,找到目標位置,
2.語言上的地址,全部都是虛擬地址
3.將虛擬地址轉化為物理地址
4.頁表+MMU(Memmory Manager Unit——硬件)
5.野指針,越界->非法地址->MMU轉化的時候,一定會報錯。因為MMU這個硬件其中也有寄存器,注意,外設也有寄存器的,不只是CPU有寄存器。

?結論:硬件也能產生信號。所有的信號,都有其來源,但最終全部都是被OS被識別、解釋、發(fā)送的。

信號的常見問題

為什么所有的信號產生,最終都要由OS來執(zhí)行?
因為OS是進程的管理者。

信號的處理是否是立即處理的?
由OS在合適的時機進行處理。

信號如果不是被立即處理,那么信號是否需要暫時被進程記錄下來?記錄在哪里?
需要被記錄下來,記錄在進程PCB中對應的信號記錄位圖。

如何理解OS向進程發(fā)送信號?
本質是OS直接修改PCB中的信號位圖,根據信號編號修改特定的比特位(由0置1)。

http://aloenet.com.cn/news/40216.html

相關文章:

  • 徐州網站公司站長之家怎么用
  • 一個公司做100個網站百度一鍵安裝
  • 網站加視頻播放設計怎么做的網站建設維護
  • 嵌入式應用軟件開發(fā)做網站排名優(yōu)化的公司
  • 藝陽科技網站建設seo系統(tǒng)
  • php團購網站的難點開發(fā)制作app軟件
  • 哪個網站能學做微商網站生成器
  • 如何查看網站 是哪家做的蘇州網站制作開發(fā)公司
  • 網站優(yōu)化方案 site ww企業(yè)seo優(yōu)化服務
  • 個人soho要怎么做企業(yè)網站網站優(yōu)化招聘
  • 阿里云網站建設的實訓報告北京外包seo公司
  • 自己做代練網站steam交易鏈接怎么改
  • 臺州網站排名公司推廣營銷app
  • 美團網站界面設計超級外鏈吧外鏈代發(fā)
  • 網站開發(fā)排期表模板重慶seo小z博客
  • wordpress獲取登錄用戶的名字seo搜索引擎優(yōu)化視頻
  • 江華網站建設域名大全
  • 天津網站在哪里建設seo診斷
  • wordpress 回收站在哪電銷系統(tǒng)軟件排名
  • 做cpa用什么類型的網站好百度 營銷推廣是做什么的
  • 人與狗做的電影網站百度網盤怎么用
  • 許昌專業(yè)做網站公司百度站長工具怎么查排名
  • 深圳哪里做網站好廣州番禺發(fā)布網
  • 圖書館網站建設教程電商營銷
  • 查網站排名搜索引擎入口google
  • 網站備案必須是企業(yè)嗎外鏈網盤源碼
  • 德州網站優(yōu)化淘寶攝影培訓推薦
  • 珠海做網站方案一元手游平臺app
  • php網站怎么注入網站排名怎么搜索靠前
  • 汽車網站建設方案英語培訓機構