开机自动启动自己编写的QT程序

40 篇文章 2 订阅
建立好QT运行环境后,要运行自己编写的基于QT/E的图形界面程序,一般需要在终端输入命令才能运行,并且第一个运行的QT程序要加上  -qws 参数。以下方法可以让QT程序在开机的时候自动启动,并作为守护进程在后台运行。

由于QT程序的运行环境需要配置tslib和qt相关的环境变量,所以在启动QT程序前要保证程序的运行环境已经设置好了相应的环境变量。

嵌入式下设置环境变量可以有几种方法:
第一,加入/etc/profile文件,这里的设置将会影响所有的登录用户。
第二,在执行脚本里面设置环境变量,并在脚本内执行程序,脚本执行结束后环境变量将只被脚本内启动的程序拥有,其他地方不可见,该程序的子程序也将继承这些环境变量。

下面是一个自启动QT程序的例子:
可执行文件:clock   是一个用QT编写的模拟时钟界面,如果直接将clock作为图形服务程序运行,理论上是可以,但是经过实验发现第一次启动clock通常会失败,第二次才会成功,原因可能是该程序比较庞大,不适合作为图形服务程序。(更深层次的原因就不清楚了~~~)
为了解决这个问题,单独使用一个空界面的QT程序basicqt先作为图形服务程序启动,然后再启动clock。成功~~

使用过程如下:
(0)编写basicqt程序,作为图形服务程序:
#include <QApplication>

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    return app.exec();

(1)编写basicqt.sh脚本,用来启动basicboot:
#!/bin/sh                                                                                                   

#configure for tslib                                                                                    
export TSLIB_ROOT=/usr/local/tslib                                                         
export TSLIB_TSDEVICE=/dev/input/event0                                            
export TSLIB_CALIBFILE=/etc/pointercal                                                 
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf                              
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts                                      
export TSLIB_CONSOLEDEVICE=none                                                   
export TSLIB_FBDEVICE=/dev/fb0                                                           
export LD_LIBRARY_PATH=/usr/local/tslib/lib:$LD_LIBRARY_PATH      

#configure for qt                                                                                       
export QTDIR=/usr/local/qtlib/                                                                  
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH               
export PATH=$QTDIR/bin:$PATH                                                            
export QWS_MOUSE_PROTO=tslib:/dev/input/event0                            

/opt/basicboot 1>/dev/null 2>/dev/null                                                      
(2)编写basicboot.c程序,用来使basiqt作为守护进程运行:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main (int argc, char *argv[])
{
    printf("running clock...\n");
    pid_t pid;
    pid = fork();
    if (pid < 0){
        perror("fork");
        exit(1);
    }
    if(pid != 0){
        exit(0);
    }
    if(pid == 0){
        setsid();
        chdir("/");
        int fd;
        fd = open("/dev/null", O_RDWR);
         if(fd != -1){
             dup2(fd, STDIN_FILENO);
             dup2(fd, STDOUT_FILENO);
             dup2(fd, STDERR_FILENO);
         }
         if(fd > 2){
             close(fd);
         }
         umask(0027);
         char const *bp[] = {"basicqt", "-qws"};
         execv("/opt/basicqt", bp);     
    }        
    return 0;
}
(3)在/etc/init.d/rcS中加入脚本执行语句  /opt/basicqt.sh 
(4)编写clock.sh脚本,用来启动clockboot程序:
#!/bin/sh                                                                                                                  
                                                                                                                               
#configure for tslib                                                                                                  
export TSLIB_ROOT=/usr/local/tslib                                                                       
export TSLIB_TSDEVICE=/dev/input/event0                                                          
export TSLIB_CALIBFILE=/etc/pointercal                                                               
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf                                            
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts                                                  
export TSLIB_CONSOLEDEVICE=none                                                                
export TSLIB_FBDEVICE=/dev/fb0                                                                        
export LD_LIBRARY_PATH=/usr/local/tslib/lib:$LD_LIBRARY_PATH                    
                                                                                                                               
#configure for qt                                                                                                     
export QTDIR=/usr/local/qtlib/                                                                                 
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH                              
export PATH=$QTDIR/bin:$PATH                                                                           
export QWS_MOUSE_PROTO=tslib:/dev/input/event0                                           
                                                                                                                                
exec /opt/clockboot 1>/dev/null 2>/dev/null                                                             
(5)同样编写clockboot.c程序,让clock成为守护进程,区别在于运行clock时就不用加-qws参数了。
(6)在/etc/init.d/rcS中加入脚本执行语句  /opt/clock.sh 

启动流程:
(1)init 进程读取/etc/init.d/rcS文件,启动/opt/basicqt.sh
(2)执行basicqt.sh:设置环境变量,启动basicboot程序。
(3)执行basicboot程序:将basicqt程序作为守护进程运行,并使用-qws参数。
(4)init 进程读取/etc/init.d/rcS文件,启动/opt/clock.sh
(5)执行clock.sh:设置环境变量,启动clockboot程序。
(6)执行clockboot程序:将clock程序作为守护进程运行,不用-qws参数。
(7)完成。

这里两个脚本设置的环境变量只是传递给了两个启动的程序,最终被分别传递给了两个守护进程,其他地方是不可见的。因此虽然这里可以启动QT程序了,但是在终端下面输入命令运行QT程序还是不成功的,因为终端下面没有设置环境变量。要想设置终端的环境变量需要将环境变量加入/etc/profile文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值