linux守護程序一點體會

這幾天遇到一個比較奇怪的故障。
一個程序從shell裏執行是正常的,可以正常初始化之後轉入守護程序然後正常運行。可是如果在守護程序裏使用execvp重啓動就不能正常工作。
今天仔細研究了一下,才發現了問題所在。
程序轉爲守護進程有這樣一段代碼:

for(int i=0;i<3;i++)close(i);

這段代碼的目的是關閉標準輸出、標準輸入和標準錯誤。然後在守護程序使用execvp重新啓動的時候,這幾個已經被關閉了,所以再一次轉爲守護進程的時候關閉的不是標準輸出這些,而是在初始化時打開的其它文件,這樣就造成了後續程序執行異常。
把代碼改成這樣:

	struct stat st;
	for(int i=0;i<3;i++){
		fstat(i,&st);
		if(S_ISCHR(st.st_mode))close(i);
	};

關閉之前先判斷一下,看是不是字符設備,如果是再關閉。這下就正常了。當然,字符設備並不一定就是標準輸出這些,如果你也有打開字符設備,那可能就要在打開這些文件和轉爲守護進程之間安排好順序了。

發佈了21 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章