接触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
现有的指令得到两列结果(602151 vcapture-test)
如果想得到单独的pid号,可以在加awk指令过滤(602151)
echo `ps -e -o pid,comm | grep "vcapture-test" | grep -v PID | grep -v grep | awk '{print $1}'`
其他:
在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);