接觸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);