乙個看似詭異的錯誤

2021-08-31 20:40:16 字數 1540 閱讀 5882

先上**

客戶端**如下:

#include

#include

#include

#include

#include

void str_cli(file *stream, int fd);

int main(int argc, char* argv)

int socket_fd[5];

int i;

for(i = 0; i < 5; i++)

}str_cli(stdin, socket_fd[0]);

return 0;

}void str_cli(file *stream, int fd)

}

伺服器端**如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

void str_echo(int fd);

void sig_chld(int signal);

int main()

else

}pid_t child_pid;

if ((child_pid = fork()) == 0)

close(connect_fd);}}

void str_echo(int fd)

else}}

void sig_chld(int signal)

程式的預期功能是:

客戶端從標準輸入讀入一行,傳送到伺服器,伺服器接受到訊息一行,將該訊息回送到客戶端,客戶端將接受到回送訊息顯示在標準輸出上。

bug特徵:

第一次開啟客戶端,輸入字元,不能正確回顯,訊息阻塞在read部分,不關閉服務端,重啟客戶端,工具就能正常工作。

bug分析:

服務端程式的

if ((connect_fd = 

accept(listen_fd, (struct sockaddr *) &client_addr, &client_addr_length)

< 0))

括號加錯了位置。第一次開啟客戶端程式的時候,connect_fd被錯誤的賦值為1,導致其accept、read、write都在標準輸入上進行。但是執行到

close(connect_fd);

的時候,標準輸入被關閉,當關閉客戶端程式再次開啟的時候,accept返回的的結果是當前最小fd,該fd為0,0<0的結果為0,陰差陽錯,connect_fd被賦予了正確的fd,所以第二次,程式就能正常工作。所以初學者看上去詭異的bug就出現了。感謝文卿大牛啊。

經驗教訓:

如果按照程式設計規範進行,就能避免很多著由看似不起眼的小問題出現的bug.....程式設計規範!!!!

loadrunner 乙個詭異問題

最近使用loadrunner壓測乙個專案的時候,發現tps波動巨大 且平均值較低。使用jmeter壓測則沒有這個問題。經過多方排查發現乙個讓人極度費解的原因 原指令碼 指令碼其他 web submit data aaa action 此處為密文鏈結 事務判斷邏輯等 tps圖如下 修改後的 指令碼其他...

記錄乙個詭異的函式呼叫返回錯誤的指標bug

include test.h void main typedef struct s s s s array 10 include test.h s get struct s 在大型程式中,複雜的makefile可能會通過上面這種project 即能夠編譯成功 但是在執行過程中printf語句會cru...

乙個sqlite應用詭異的問題

今天從應用層面解決了乙個詭異的問題。某程式,在伺服器a上跑速度很快,幾乎能將cpu乙個核的資源佔滿。而在伺服器b上跑很慢,慢了將近10倍 而且cpu使用率很低。伺服器a和b都是同樣的系統,幾乎相同型號的伺服器。通過各種排查原因,未果。最後還是認為是程式的問題。最終問題發生原因鎖定在乙個sqlite庫...