信號機編程
㈠ Linux fd 系列|信號編程(signal)竟能這樣做漲姿勢
來源 | 奇點雲存儲(id : qiyacloud)授權轉載
如若轉載請聯系原公眾號
信號是什麼?
首先說,信號(signal)是什麼?
信號( signal )本質是 Linux 進程間通信的一種機制,也叫 軟中斷信號 。既然是通信機制,那麼就是傳遞信息用的,信號傳遞的信息很簡單,就是一個整數,一般用於配合系統管理任務,比如進程的終結、恢復、熱載入等。
信號都用整數常量表示,命名以 SIG 為前綴,比如 SIGINT( ctrl-c 觸發),SIGKILL( kill -9 觸發 )。
信號一般怎麼產生?
信號處理分為兩個階段 :
signalfd 是什麼?
了解了什麼是信號( signal ),那 signalfd 又會是什麼呢?
是一個跟信號關聯的 文件描述符 ,能夠以 io 的行為獲取到系統信號,屬性上來講 signalfd 也是一個匿名 fd 類型。
signalfd 長什麼樣子?
奇點按照 man signalfd 裡面的例子,寫了個 demo,跑在 Linux 機器上,按照慣例去看下 fd 的樣子。
從這里可以得到簡單的信息:
signalfd 使用姿勢?
其實信號是很講究的,甚至有信號編程一說,Linux 的 signalfd 為信號的處理提供了一種新的方法, 統一到文件的 io 模式,契合一切接文件的理念 。
系統調用:
該系統調用返回一個整數類型 signalfd,這個句柄跟信號行為綁定,當發生信號的時候,句柄觸發可讀事件。
第一個參數也可以傳入一個有效的信號 fd 的句柄, 如果傳入的是 -1 ,那麼內核會自動創建一個新的 fd 。
完整的代碼例子,在 Linux 機器上,通過 man signalfd 就可以獲取到。
上面的例子,signalfd 沒有信號(沒有可讀事件)的時候會阻塞在 read 調用上,運行效果如下:
可以看到每一次 ctrl + c 觸發的信號被捕捉到,並且列印出來。用文件 io 的方式來接收信號,牛。
怎麼做到的呢?照例,我們淺析一下內核的代碼,位於 fs/signalfd.c ,這是一個很小的文件,正是這個文件完成了對信號「文件化」的封裝。
上面最重要的兩個調用:
signalfd 原理剖析
1 signalfd
看一下 signalfd 支持的介面調用:
通過這個可以知道 signalfd 支持的特性:
2 signalfd_poll
這個函數做的事情非常簡單,就是把 等待對象 掛到當前進程的信號結構的鏈表上。表頭是: current->sighand->signalfd_wqh ,這個就有意思了,這里直接掛到當前進程的結構上。換句話說,喚醒也是自此表頭開始。
回憶一下 timerfd ,是掛在 timerfd_ctx->wqh 的欄位上。這里的差別是因為信號是對進程來說的。
3 signalfd_read
讀一個 signalfd 的操作非常簡單,主要邏輯:
簡要的代碼注釋如下:
這里就能非常清晰的看到, 進程有信號的時候,signalfd 句柄就是可讀的 。
signal 和 epoll 的配合
1 熟悉的 epoll_ctl
epoll_ctl 注冊 signalfd 的時候,調用 signalfd_poll , signalfd_poll 會把 epoll 創建的 wait entry 掛到 current->sighand 上。喚醒的時候調用這個 wait 鏈表的回調。
2 什麼時候喚醒呢?
喚醒的操作其實不在 signalfd.c 文件中,而是在原有的信號軟中斷的流程中。
為了知識的完整性,說個點, signalfd_notify 其實在 timer 定時器的流程中也有調用,但跟我們本次主幹沒啥關系,這里忽略。
信號的發送喚醒的簡要示意圖:
所有的信號發送都會調用到 send_signal ,在這個裡面實現了喚醒 sighand->signalfd_wqh 鏈表的操作。從而使得 epoll 感知到 signalfd 可讀了(因為來信號了),使得 epoll 從 epoll_wait 出喚醒,然後調用 read 操作,把信號的相關信息從句柄中讀出來。
劃重點:喚醒在 信號發送 的過程。
總結
㈡ 交通信號燈的原理是什麼交通怎麼不會亂呢紅綠黃三色變換時間有規定嗎
LED交通信號燈是在規定時間規范不同方向車輛行駛,變換時間是按實地考察根據不同路段車輛流通狀況來變換,規定紅綠燈亮的時間長度。這個時間是通過信號機控制
㈢ 軟體工程師工作總結
引導語:工作總結是做好各項工作的重要環節.通過它,可以全面地,系統地了解以往的工作情況,以下是我搜集整理的軟體工程師工作總結,歡迎大家閱讀!
軟體工程師工作總結篇一
光陰似箭,歲月如梭,輝煌的20xx已經過去,充滿希望的20xx已在不知不覺中走到了12月份,現將20xx年下半年工作總結如下:
一、項目方面:
主要是圍繞信號機開發的各種軟體,如信號機底層軟體、信號機設置軟體、以及為了保障信號安全的防火牆軟體等,另外還圍繞交通誘導屏這個產品做了相關的工作,如誘導屏設置軟體,以及誘導屏測試軟體等工作。
1、信號機軟體開發
從去年的年底已經開始這項工作了,我的工作相對來說比較單一一點,就是信號機設置軟體以及底層軟體的通訊部分的程序代碼,以及其他的部分功能。並且現在這款信號機能夠兼容多家協議。
2、防火牆軟體的開發
這是獨立開發、並最終調試的一個軟體,能夠嚴格防止外來非法連接的軟體。由於目前還沒有我們自己的信號機中心軟體,所以目前這個軟體現在還沒有派上用場,相信隨著公司的發展,會逐漸用上這樣的軟體產品的。
3、交通誘導屏的相關工作
當然這裡面的工作就相當砸碎一些,包括設置軟體、測試軟體以及處理在調試的過程中碰到的一些問題,以及測試一些硬體模塊的好壞等。
二、團隊合作
從上面主要的工作內容來看,不是我一個人所能完成的,正所謂一切事務離不開團隊,個人無法稱英雄。今年在余sir領導之下,團隊建設有了很大的進步,每個項目開始之前,好好的交流、加強了解、對問題的共識、解決問題的方法能很好的統一起來。我個人也很好的溶入這個團隊,共同做好一個項目。沒有我們自己的信號機中心軟體,所以目前這個軟體現在還沒有派上用場,相信隨著公司的發展,會逐漸用上這樣的軟體產品的。
當然這裡面的工作就相當砸碎一些,包括設置軟體、測試軟體以及處理在調試的過程中碰到的一些問題,以及測試一些硬體模塊的好壞等。
三、工作態度
給我的最大的感觸就是一定要好好的去聆聽,每個人對待問題的看法,不管他的看法對還是不對,合理與否,或者考慮的'角度是否確切,都要好好地聆聽,至少要等他說完,如果你主觀的色彩,可能你都不願意或者不屑聽完他說的話,但是靜下心來你或許也能發現他看問題的某些角度是你沒有考慮過的,他想的某些方面也許確實是要注意到的。靜心!聆聽!把技術與大家共同分享,共同提高。
四、來年工作展望
在新的一年裡我希望能夠在交通行業里做出更多新的產品,能夠更加深入的研究下去,比如:目前我們欠缺的信號機中心軟體,交通誘導屏的中心軟體,這個兩個應該是20xx年的首要任務了,如果還有時間我希望可以做gis地理信息系統方面的內容。
軟體工程師工作總結篇二
伴隨著充實緊湊的工作生活,兩個月的時間已經過去了。這一段時間里有工作上的收獲,知識的豐富,經驗的增長,同時也暴露出很多問題和不足。總結經驗,吸取教訓,本文將主要從幾個方面來對工作進行總結:工作的主要內容;其中的失敗和教訓以及成功和經驗;展望下一階段的工作,確定自己的目標。以此作為懲前毖後的記錄。
1. 工作的主要內容
在這兩個月的工作中,我的總體任務是協助蘇薇做好武警黃金部隊礦業權管理系統的後期測試,編碼,修改,文檔編寫的工作,分解開來之後,我主要做了三件事:1.編寫礦業權系統的各類文檔;2.礦業權系統的編碼及bug勘誤工作;3.礦業權系統的測試工作。下面依照時間來對我的工作進行介紹。
初踏入職場,進入專業的軟體製造公司,對我,一個沒有接觸過標准軟體製作過程的新人來說,起步就是一個很大的難題。若直接做開發,則業務不熟練,代碼不規范,弊大於利;若僅做學習,則不能跟上項目的步伐,不能以最快的速度融入工作中去。
在我還在忐忑自己到底要做什麼工作的時候,任務已經下達了,首先進行礦業權系統的測試工作。這樣的好處在於能夠在測試的過程中,了解項目的整體布局,了解項目中的業務邏輯,了解項目中尚未完成的工作並以此作為下個階段的工作目標。至此,入職工作順利起步。
在對礦業權系統進行測試之後,暴露了系統的諸多問題,測試過程中發現礦權系統沒有進行輸入限定,為了解決這個問題需要對整個系統的數據進行整理,我的下一個任務就是編寫礦業權系統的數據需求文檔。在編寫該文檔的過程中,對礦權系統進行了更深入的了解,為之後的bug勘誤工作奠定了一定的基礎。
完成了礦業權系統的數據需求文檔的編寫之後,新的任務是對整個礦權的輸入數據進行輸入限定,在任務開始之處是極為困難的,幸而得到了同事們的幫助才得以順利完成任務。任務雖然完成,但是對輸入限定實現方法的一知半解以及任務完成過程中的不仔細,為之後發生的問題也埋下了苦果。
在對礦業權系統添加輸入限定完成之後,進入了解決程序小問題的階段,對礦權系統進行細微的縫補工作。這段時間是學習多於工作的,不同的問題督促我要每天和網路親密接觸數百次,又要勞煩諸位在百忙中的同事抽出時間來給我幫忙。雖然辛苦一點,但收獲卻是滿滿。
完成了系統的修補之後,我們的程序送到了四惠進行第一輪測試,在測試的一周里,我主要是補充網路編程的基礎知識。
第一輪測試結果出來之後,我們項目組開始了緊張的第一輪礦業權系統bug勘誤工作。拿到bug列表之後,發現有一小半錯誤皆是因我而起,輸入限定問題很多,我也主動承擔了輸入限定部分的bug勘誤工作。
第一輪bug勘誤工作完成後,進行了第一輪了回歸測試,測試結果已然不盡人意,仍然存在大量的問題需要修改,而且很多問題還是因我而起,輸入限定仍然存在大量問題,再一次進行修改之後,我們的程序送到了十五所進行所檢。
在進行所檢之餘,我又接到了新的任務,完成礦權系統的概要設計以及詳細設計文檔的編寫。這兩份文檔已於9月2號編寫完畢。
現階段我的任務是根據所檢的bug列表,對礦權系統進行回歸測試。
2. 工作中失敗的教訓以及成功的經驗
對於失敗的教訓要吸取,成功的經驗要進行總結。我對成功的定義是:在保證質量的前提下完成既定的計劃或目標就是成功。其他的所有結果都是失敗。
成功的經驗:
1) 敢於接受任務並想盡一切辦法完成
入職兩個月最大的收獲就是敢於接受任務並想盡辦法完成,每一個任務對於初入職場的我都是一個挑戰,如何保質保量完成任務是最基本的要求。這兩月最大的成功在於沒有一次任務是拖沓的,每次都盡最大努力完成了任務。
2) 勇於承擔錯誤,正視自身的問題
在這兩個月的工作中可謂是錯誤不斷,從文檔的錯別字這種小問題到礦權系統bug修改不正確導致崩潰這種大錯誤,暴露出來了很多的問題,我秉承著有錯即改,下不為例的思想,正視自己的錯誤並積極改正,因此這也算是一個成功。
失敗的教訓:
1) 重視每一個細節,不要忽視小問題
在最初進行礦業權系統數據需求文檔的編寫的過程中,對某些頁面的數據在資料庫中沒有存儲的情況沒有加以重視,在後期進行數據限定的時候,還要重新修改數據需求文檔,造成了不必要的時間浪費。從這個事情上得到教訓就是不要放過任何一個小問題,這個小問題可能導致之後的大問題。
2) 進行重復工作也不能大意
在對礦權系統進行輸入限定的方法熟悉之後,都是重復性的工作,給每個頁面,每個欄位進行輸入控制語句的添加,在進行了數個頁面之後,出現了有的頁面沒有添加完整,或者提示語句不正確的情況,在後續的bug勘誤中出現了大量此類問題,浪費了大量的時間和精力修改。從這個事情上得到的教訓就是工作不能大意,重復性的工作更要完成好。一般重復性的工作第一次做不好,後續檢查修改是非常浪費時間的。
3) 考慮問題要嚴謹
在對礦權系統bug勘誤的過程中,對輸入限定條件的判斷出了問題,我想當然的按照我的主觀思路對數據進行了限定,而在回歸測試的時候出了問題,這些都是考慮不嚴謹的後果。這個事情的教訓就是考慮不嚴謹直接導致問題推倒重來,影響了工作效率,而且很容易埋下隱患。
4) 注重用戶體驗
在礦權系統bug勘誤的過程中,修改最多的在於坐標系統的提示語句,因為坐標系統不僅要求數據必須填入,而且每一個數據都有嚴格的格式限定,因此每一個錯誤提示的彈出都要本著如何讓用戶知道哪裡錯了為原則進行設置。在最初的限定裡面,語句粗糙,彈出語句不明確,造成了用戶使用的不方便,還得重新進行改造。這個問題的教訓是一定要從用戶的角度出發考慮問題,注重用戶體驗從簡單的提示語句做起。
3. 展望下一階段的工作
下一階段短期內我們的工作主要針對礦權系統的使用的資料庫變更來對我們的系統進行修改。我的工作任務主要是學習Oracle資料庫和SQL資料庫的使用上的區別,做好從SQL資料庫向Oracel資料庫的遷移工作。
這兩個月的工作生活是充實且富有樂趣的,結識了很多同事和朋友,公司的氛圍是非常輕松愉快的。感謝兩個月來李鵬經理的關心,感謝部門同事的悉心指導,感謝公司各位同事的熱心幫助,希望能在接下來的工作中能懲前毖後,總結經驗,吸取教訓,做到個人與公司共榮辱同進退,共同實現中地的輝煌。