您的位置:首页 > 编程语言 > Qt开发

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

2014-05-13 08:39 501 查看
建立好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文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: