1. 程式人生 > >inet_ntoa之坑------再談不可重入函式中的static

inet_ntoa之坑------再談不可重入函式中的static

      不想用過多的話語來囉嗦, 還是看程式碼吧(如下結果非常讓人吃驚):

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

int main()
{
    unsigned long n1 =  inet_addr("10.213.120.1");
	unsigned long n2 =  inet_addr("172.18.18.1");
	
	struct in_addr stAddr1, stAddr2;
	stAddr1.s_addr = n1;
	stAddr2.s_addr = n2;
	
	printf("%lu\n", n1);
    printf("%lu\n", n2);

    char *p1 = inet_ntoa(stAddr1);
	char *p2 = inet_ntoa(stAddr2);

    printf("%s\n", p1);
    printf("%s\n", p2);
	
    return 0;
}
       結果:

[email protected] Desktop> g++ test.cpp 
[email protected] Desktop> ./a.out 
24696074
17961644
172.18.18.1
172.18.18.1

      為什麼是相同的ip呢? 因為在inet_ntoa中static定義, 那為什麼知道有static定義呢? 看看inet_ntoa的原型就基本明白了:char *inet_ntoa(struct in_addr in);   要返回char *, 而入參沒有char *, 那幾乎就是要用static了啊, 看了一下inet_ntoa的實現, 果然如此。

      static引起的不可重入問題, 我們已經討論過了, 便不過多聊。

      總之, 不可重入函式就是坑, inet_ntoa便是其中之一。

相關推薦

inet_ntoa------不可函式static

      不想用過多的話語來囉嗦, 還是看程式碼吧(如下結果非常讓人吃驚): #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include &l

Linux 環境程式設計——淺函式不可函式

在實時系統的設計中,經常會出現多個任務呼叫同一個函式的情況。如果有一個函式不幸被設計成為這樣:那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。這樣的函式是不安全的函式,也叫不可重入函式。 相反,肯定有一個安全的函式,這個安全的函式又叫可重入函式。那麼什麼是可

Linux系統程式設計——淺函式不可函式

在實時系統的設計中,經常會出現多個任務呼叫同一個函式的情況。如果有一個函式不幸被設計成為這樣:那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。這樣的函式是不安全的函式,也叫不可重入函式。 相反,肯定有一個安全的函式,這個安全的函式又叫可重入函式。那

函式不可函式

在實時系統的設計中,經常會出現多個任務呼叫同一個函式的情況。如果有一個函式不幸被設計成為這樣:那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。這樣的函式是不安全的函式,也叫不可重入函式。 相反,肯定有一個安全的函式,這個安全的函式又叫

C語言函式 && 不可函式函式

在 實時系統的設計中,經常會出現多個任務呼叫同一個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任 務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指一個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料是否

訊號程式設計訊號傳送及訊號處理函式遇到不可函式

kill函式 函式原型: Int kill(pid_t pid, int siq) 功能:既可以向自身傳送訊號,也可以向其他程序傳送訊號; 引數: pid>0 將訊號sig發給pid程序 pid=0 將訊號sig發給同組程序 pid=-1 將訊號si

什麼是可函式不可函式

1.可重入函式 在實時系統的設計中,經常會出現多個任務呼叫同一個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任 務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指一個可以被多個任務呼叫的過程,任務在呼叫時不必擔

Linux:可函式不可函式

可重入函式          一個函式在執行的過程中被打斷,然後會再被從頭執行一次,執行完後,再回來把剛才沒執行完的部分執行完。這就相當於巢狀的執行了。函式是公共程式碼,這樣的執行是允許的。函式的執行可以被打斷,打斷之後還可以再從頭執行,執行完後接著執行剛才沒有執行的程式

什麼是可函式不可函式(轉)

可重入函式      在 實時系統的設計中,經常會出現多個任務呼叫同一個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任 務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指一個可以被多

不可函式與執行緒安全函式

      在多執行緒或有異常控制流的情況下,當某個函式執行到中途時,控制流(也就是當前指令序列)就有可能被打斷而去執行另一個函式. 如果在這種情況下不會出現問題,比如說資料或狀態不會被破壞,行為確定。那麼這個函式就被稱做"可重入"的.   補充:       函式是可重入

函式不可函式概念以及編寫規範

1、定義 一個可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入OS排程下去執行另外一段程式碼,而返回控制時不會出現什麼錯誤;而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等,所以它如果被中斷的話,可能會出現

函式不可函式(轉)

轉自http://www.cnblogs.com/luvi/archive/2008/05/09/1190493.html 主要用於多工環境中,一個可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入OS排程下去執行另外一段程式碼,而返回控制時不會出現什麼錯誤;而不

九、curator recipes不可鎖InterProcessSemaphoreMutex

print ces lba art cto catch apache ava har 簡介 recipes的InterProcessSemaphoreMutex是一種不可重入的互斥鎖,也就意味著即使是同一個線程也無法在持有鎖的情況下再次獲得鎖,所以需要註意,不可重入的鎖很

函數與不可函數

如果 interrupt 信號量 發生 標準io 一個 i/o 可重入 規則 參考:http://blog.csdn.net/wenhui_/article/details/6889013 重入:重新進入 區別:多個任務能否同時調用一個函數,例如操作系統在進程調度過程中,或

java 執行緒——可所鎖&不可

不可重入鎖 當前執行緒已經獲取了鎖,當這個執行緒再次嘗試獲取這個鎖的時候就會獲取不到被阻塞,我們來寫一個不可重入鎖的例子。 class Lock{ private boolean lock = false; /** * 加鎖 * 當lock = true;說明

java基礎總結(二十九)--Java不可鎖和可鎖理解

來自:https://blog.csdn.net/u012545728/article/details/80843595   最近正在閱讀Java ReentrantLock原始碼,始終對可重入和不可重入概念理解不透徹,進行學習後記錄在這裡。 基礎知識 Java多執行緒的wai

使用zookeeper序列節點實現不可分散式鎖

一、前言 在同一個jvm程序中時,可以使用JUC提供的一些鎖來解決多個執行緒競爭同一個共享資源時候的執行緒安全問題,但是當多個不同機器上的不同jvm程序共同競爭同一個共享資源時候,juc包的鎖就無能無力了,這時候就需要分散式鎖了。常見的有使用zk的最小版本,redis的set函式,資料庫鎖來實

QThread 與 QObject的關係(QObject可以用於多執行緒,可以傳送訊號呼叫存在於其他執行緒的slot函式,但GUI類不可

QThread 繼承 QObject.。它可以傳送started和finished訊號,也提供了一些slot函式。 QObject.可以用於多執行緒,可以傳送訊號呼叫存在於其他執行緒的slot函式,也可以postevent給其他執行緒中的物件。之所以可以這樣做,是因為每個執行

程式的可不可

可重入程式是指該程式被某程式呼叫,但還未結束,又被另一個程式呼叫。 可重入程式是通過減少對換資訊量來改善系統響應時間的。 文章主要轉自 http://www.cppblog.com/prayer/archive/2009/07/05/89270.html 這種情況出現在多工

zookeeper curator 可不可分散式鎖

轉載自https://www.cnblogs.com/zhangjunqing/p/7823626.html 基礎知識:http://www.cnblogs.com/LiZhiW/p/4931577.html 專案路徑:https://gitee.com/zhangjunq