進程的掛起以及可重入函數

  1. 相關接口
    這里寫圖片描述
    ????pause 函數用于將進程掛起. 如果信號的處理動作是終止進程, 則進程終止, pause 函數沒有返回值; 如果信號的處理動作是忽略, 則進程被掛起, pause函數不返回, 如果信號的處理動作是捕捉, 則調用信號處理動作之后pause 返回 -1.
  2. 來看一段代碼
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>void sig_alarm(int seconds)
{}
int mysleep(int seconds)
{struct sigaction act;struct sigaction oact;int unslept = 0;act.sa_handler = sig_alarm;act.sa_flags = 0;sigemptyset(&act.sa_mask);sigemptyset(&oact.sa_mask);sigaction(SIGALRM, &act, &oact);alarm(seconds);pause();unslept = alarm(0);sigaction(SIGALRM, &oact, NULL);
}
int main()
{while(1){mysleep(5);printf("5 seconds after\n");}return 0;
} 

??????????????????????????????這里寫圖片描述
????上面代碼是用來自主實現一個 sleep 函數. 先將 SIGALRM 信號注冊,然后設定一個鬧鐘, 接著系統調用 pause 函數等待, 在 nsecs 秒之后, 鬧鐘設定的時間到了, 此時內核給進程發送一個 SIGALRM 信號, 當內核正要切回到用戶態時, 發現一個可以遞達的信后 SIGALRM, 它的處理動作是 sig_alrm, 此時內核有切回到 這個函數處取執行該信號的自定義動作, 在處理 sig_alrm 函數時, 系統將 SIGALRM 信號屏蔽, 當處理完這個函數時, 對 SIGALRM 函數解除屏蔽, 同時系統通過調用 sigreturn 函數返回到內核態, 接著從內核態返回到 主控制流處, 執行剩余的代碼
????(1)也許會有人問信號處理 sig_alrm 函數時什么都沒有干為什么還要注冊, 原因很簡單, 如果對 SIGALRM 信號不注冊, 當注冊一個 5 秒的鬧鐘信號時,5 秒之后該信號會被遞達, 而此時的信號沒有注冊,信號的處理動作將會是終止進程, 此時進程終止, 程序退出, 而我們要實現的是將進程睡眠 5 秒鐘, 那不就和我們的目的有沖突了嗎?
????(2)也許還會有人問, 為什么在sleep函數之后需要對 SIGALRM 信號的默認處理動作進行恢復, 原因很簡單. 加入這個代碼很長, 而我們在 sleep 函數之后系統又用到了 SIGALRM 信號, 而此時我們的目的是在 n 秒之后操作系統給進程發送一個 SIGALRM 信號來終止信號, 而此時我們沒有將該信號的處理動作進行恢復, 進程會去執行 sig_alrm 函數, 此時進程就不會在 5 秒之后退出
3. 可重入函數
????(1)定義 :
????????重入的意思就是函數在被不同的執行流調用, 有可能在第一個執行流還沒有執行完的時候又被第二個執行流調用. 而此時可能會由于重入導致一些錯誤, 此時的函數稱為不可重入函數, 而當第一個執行流還沒有執行完時, 第二個執行流進入, 此時沒有導致函數執行功能發生錯誤, 此時這個函數就叫做可重入函數.
????(2)條件:
????????如果一個函數調用了 malloc , free, 或者標準庫 I/O函數,等全局變量的時候這個函數就叫做不可重入函數, 而如果一個函數只調用了自己的局部變量, 此時的函數叫做可重入函數,因為系統函數和主控制流各自獨立擁有自己的堆棧, 不存在調用關系, 因此兩個互不干擾

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384057.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

POJ1236Network of Schools——強連通分量縮點建圖

【題目描述】 A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a list of schools to which it distributes software (the “receiving schools”). Note that if B is in the distri…

C——通過調用函數分配內存

http://blog.csdn.net/u012627502/article/details/3579724 1&#xff09;以返回值方式返回&#xff1a;把動態分配的存儲位置地址&#xff0c;賦值給指針類型返回值&#xff08;不同于被調用函數的自動變量地址&#xff09; 2&#xff09;以形參形式返回&#xff1a;二級指針類…

gdb調試多進程程序

1.gdb下調試多進程程序只需要以下幾條命令即可 ???????? ????除此之外還可以查看正在調試的進程 info inferiors, 同時也可以將當前正在調試的進程切換到另外一個進程中讓其取運行 ????2.代碼調試演示 #include<stdio.h> #include<stdlib.h> #…

BZOJ1123-BLO——強連通分量求割點+計數

【題目描述】 Byteotia城市有n個 towns m條雙向roads. 每條 road 連接 兩個不同的 towns ,沒有重復的road. 所有towns連通。Input 輸入n<100000 m<500000及m條邊Output 輸出n個數&#xff0c;代表如果把第i個點去掉&#xff0c;將有多少對點不能互通。Sample Input 5…

關于memcpy和memmove兩函數的區別

http://blog.csdn.net/caowei840701/article/details/8491836 [cpp] view plaincopy <p> 關于memcpy和memmove兩個c標準庫函數&#xff0c;其功能都是將一塊內存區域中的指定大小內容復制到目標內存中&#xff0c;在翻閱c標準庫實現的源代碼我們發現他們是有區別的。&…

判斷字符串出棧合法性

先來看說一下思路 接下來就是寫代碼了 int StackOrder(SeqStack* stack, char* input, char* output, int size_input, int size_output) {if(stack NULL || input NULL || output NULL){return 0;}int i_input 0;int j_output 0;SeqStackType value;for(; j_output <…

CodeForces - 1200C——小模擬

【題目描述】 Amugae is in a very large round corridor. The corridor consists of two areas. The inner area is equally divided by n sectors, and the outer area is equally divided by m sectors. A wall exists between each pair of sectors of same area (inner o…

1 單例模式

達內 閔大神 //餓漢單例模式 #include <iostream> using namespace std;class Singleton { public:static Singleton& getInstance(){return s_instance;} private:Singleton(){}Singleton(const Singleton& that){}static Singleton s_instance;//靜態成員變量 …

共享棧

1.定義 所謂共享棧就是利用一個數組實現兩個棧. 先來看一下共享棧的數據結構 typedef struct SharedStack {int top1;int top2;SeqStackType* data; }SharedStack; 2. 初始化 void SharedStackInit(SharedStack* stack) {if(stack NULL){return;//非法輸入}stack -> top…

BZOJ1018 | SHOI2008-堵塞的交通traffic——線段樹維護區間連通性+細節

【題目描述】 BZOJ1018 | SHOI2008-堵塞的交通traffic 有一天&#xff0c;由于某種穿越現象作用&#xff0c;你來到了傳說中的小人國。小人國的布局非常奇特&#xff0c;整個國家的交通系統可 以被看成是一個2行C列的矩形網格&#xff0c;網格上的每個點代表一個城市&#xff0…

C++ 函數隱藏

C該函數隱藏 只有基類成員函數的定義已聲明virtualkeyword&#xff0c;當在派生類中的時間&#xff0c;以支付功能實現&#xff0c;virtualkeyword可以從時間被添加以增加。它不影響多狀態。 easy混淆視聽&#xff0c;掩蓋&#xff1a; &#xff0c;規則例如以下&#xff1a; …

迷宮求解(遞歸)

首先來看一下迷宮簡易圖 ???????????????????????????? ????我們用 0 來表示該位置是墻, 用 1 來表示該位置是路. 所以, 我們在處理迷宮問題的時候可以將其看成一個二維數組即可, 而對應的每一條路我們可以用坐標的形式將其表示, 所以還需要…

CodeForces - 786C——二分+模擬?

【題目描述】 Rick and Morty want to find MR. PBH and they cant do it alone. So they need of Mr. Meeseeks. They Have generated n Mr. Meeseeks, standing in a line numbered from 1 to n. Each of them has his own color. i-th Mr. Meeseeks color is ai.Rick and M…

迷宮求解(非遞歸)

上篇文章寫出了利用函數形成棧楨的特性完成迷宮求解問題, 本篇文章我們自己手動維護一個棧, 其進行出棧, 入棧, 取棧頂元素, 來完成迷宮求解尋路的過程 ????思路和以前一樣, 首先, 我們先定義一個棧, 對其初始化, 同時, 定義一個迷宮地圖, 對該地圖進行初始化, 先判斷當前…

數據結構練習——雙向鏈表

http://www.cnblogs.com/-Lei/archive/2012/04/10/2440399.html 復習一下數據結構。。。。說不準下個星期就用上了 只不過寫的很簡單&#xff0c;沒有封裝 DoubleLinkList.h #ifndef GUARD_DoubleLinkList_h #define GUARD_DoubleLinkList_h#include <stdio.h>struct Li…

CodeChef - DGCD——樹鏈剖分+差分

【題目描述】 Youre given a tree on N vertices. Each vertex has a positive integer written on it, number on the ith vertex being vi. Your program must process two types of queries :1. Find query represented by F u v : Find out gcd of all numbers on the uniq…

UVa272-TeX中的引號

【題目描述】 傳送門 【題目分析】 今天開始刷紫書的題目啦 這道題很簡單&#xff0c;需要注意的是cgetchar()需要加上括號&#xff0c;因為賦值語句的優先級比判等低 而且書中說好像最好用整型變量&#xff0c;因為EOF的值為-1&#xff0c;在字符變量中沒有這個值。&#xf…

C++中友元(友元函數和友元類)的用法和功能

http://blog.csdn.net/adriano119/article/details/5914443/ 采用類的機制后實現了數據的隱藏與封裝&#xff0c;類的數據成員一般定義為私有成員&#xff0c;成員函數一般定義為公有的&#xff0c;依此提供類與外界間的通信接口。但是&#xff0c;有時需要定義一些函數&#x…

線程的終止分離

1.線程的終止 注意該函數是針對用戶級別的, 其中 retal 必須指向一個全局變量, 或者是一個 malloc 分配的, 因為如果是線程的局部變量, 當該線程退出時, 其他線程不能得到這個變量, 因為線程的局部變量各自私有 2. 現成的取消 其中thread是線程的 tid 3.線程的等待與分離 (1)…

UVa10082

【題目描述】 傳送門 【題目分析】 同樣是一道模擬&#xff0c;但是如何巧妙快速的解決仍然不簡單。通過這道題告訴我們對于復雜確定的對應關系我們要靈活運用常量數組。 同時還需要注意的一個小問題就是字符串數組中的"//"指的是轉義后的單斜杠&#xff0c;如果只…