qnx掛死恢復腳本簡易寫法

接觸qnx兩天,拿到手上的板子bsp軟件已經被定製過,將啓動腳本的位置和文件系統做了大量更改

如下是幾個命令來處理退出和恢復過程

由於tinyRPC接口不提供退出接口,商務又不允許改接口,就採用低級的風險的退出方式exit(),遠端服務端使用了ip,port轉發等鬼東西,socket端口訪問總是無法訪問,於是用ping來查詢遠程機器是否啓動來代替查詢遠程tinyRPC服務器是否運行,但exit退出方法會引起內存泄漏,從代碼端檢測到連接斷開退出進程的寫法

void t_resume()
{
//	TSocketConnect::Inst()->SetIPAddr("192.168.1.5", 32769);
//	std::cout << "[bgk] set ipaddr...192.168.1.5....<<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl;
//
//	while(1)
//	{
//		sleep(10);
//		std::cout << "[bgk] sleep 10s, connect_sts = " << TSocketConnect::Inst()->SocketConnectStatus() << endl;
//
//		if (!TSocketConnect::Inst()->SocketConnectStatus())
//		{
//			// TRPCClientMgr::Inst()->Exit();
//			// break;
//		}
//	}
//	// exit(1);

	FILE * fp;
	char buffer[20];
	char cmp[20];

	while(1)
	{
		sleep(10);

		memset(buffer, 0, 20);
		memset(cmp, 0, 20);

		fp = popen("echo $(echo `ping -c 1 10.255.255.100`) | grep 'time=' ", "r");
		fgets(buffer, sizeof(buffer), fp);
		// std::cout << buffer << std::endl;
		pclose(fp);

		if(!memcmp(cmp, buffer, 20))
		{
			std::cout << "exit tinyrpc_service" << std::endl;
			exit(1);
		}
	}

}

 

在啓動腳本了做個檢測,發現遠程服務器連接上之後再發起tinyRPC客戶端的連接,想用telnet來過濾,命令沒有,ssh命令沒有,好在加命令相對簡單,但加上去之後發現telnet和socket一樣無法訪問遠程端口,很多linux上穩定運行的工具都沒法使用,最後只能採用極端的方法了,在qnx啓動腳本里運行一個後臺shell腳本來監控遠程服務器,一旦起來就運行tinyRPC

#!/bin/sh

# Import environment
basepath=$(cd `dirname $0`; pwd -P)

. $basepath/env_setup.sh

while true
do
	sleep 3
	result=$(echo `ps -e -o pid,comm | grep "tinyrpc_service" | grep -v PID | grep -v grep`)
	# echo $result
	if [[ "$result" != "" ]]
	then
		# echo "tinyrpc runing"
		sleep 1
	else
		result=$(echo $(echo `ping -c 1 10.255.255.100`) | grep "time=")
		if [ "${result}" != "" ]
		then
			echo "tinyrpc resume"
			tinyrpc_service &
		fi
	fi
done

 

其他:

在qnx文件系統里加命令方法,在src\hardware\startup\boards\dra72x\evm\build目錄下general commands段中加入需要的命令

telnet訪問端口腳本如下,linux上很好用,但qnx用起來有點莫名其妙,感覺不是每次返回都是確定了

#!/bin/sh

num=`echo -n "\n"|telnet 127.0.0.1 32769|grep Connected|wc -l`

if [ $num -eq 1 ]; then
	echo "network is open."
else
	echo "network is closed."
fi

Socket端口在Linux上默認打開方式爲非阻塞的,但在Qnx的默認打開方式爲阻塞的,解決方法爲設置非阻塞標誌位

int sockfd;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章