1. 程式人生 > >開機自動啟動自己編寫的QT程式

開機自動啟動自己編寫的QT程式

建立好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檔案。

相關推薦

開機自動啟動自己編寫QT程式

建立好QT執行環境後,要執行自己編寫的基於QT/E的圖形介面程式,一般需要在終端輸入命令才能執行,並且第一個執行的QT程式要加上  -qws 引數。以下方法可以讓QT程式在開機的時候自動啟動,並作為守護程序在後臺執行。由於QT程式的執行環境需要配置tslib和qt相關的環境

Qt Windows下開機自動啟動自己程式

void Widget::Readregedit() { QString path; QDir dir; path=dir.currentPath();//在QtCreator中

讓Linux系統啟動過程自動執行自己編寫的指令碼

在Linux系統,/etc路徑下,一般有以下目錄: rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d 在系統啟動的過程中,會按照rc0.d~rc6.d的順序執行這些目錄下的指令碼,如果想要系統啟動過程中執行自己編寫的指令碼,只需要將指令

Ubuntu新增開機自動啟動程式的方法

1. 開機啟動時自動執行程式 Linux載入後, 它將初始化硬體和裝置驅動, 然後執行第一個程序init。init根據配置檔案繼續引導過程,啟動其它程序。通常情況下,修改放置在 /etc/rc或 /etc/rc.d 或 /etc/rc?.d 目錄下的指令碼檔案,可以使init自動啟動其它程式。例如:

f24如何開機啟動openbox,並且啟動自己的應用程式

開機啟動openbox:         首先dnf    install    openbox裝好自己的openbox     

C#/WPF程式實現軟體開機自動啟動的兩種方法

C#/WPF程式實現軟體開機自動啟動的兩種方法 方法一:將軟體的快捷方式建立到計算機的自動啟動目錄下(不需要管理員許可權) 1.必要引用 using System; using System.Collections.Generic; using System.Linq; using Sy

C#/WPF程式實現軟體開機自動啟動的兩種常用方法

C#/WPF/WinForm/.NET程式程式碼實現軟體程式開機自動啟動的兩種常用方法函式的示例與例項帶詳細註釋 方法一:將軟體的快捷方式建立到計算機的自動啟動目錄下(不需要管理員許可權) 1.必要引用 using System; using System.Collections.Gen

Android apk程式設定開機自動啟動

1.      建立一個廣播接收器類,繼承BradcastReceiver類。 2.      在AndroidMainfest.xml檔案中註冊 ①  宣告許可權: <uses-permission android:name=”android.permission.

Ubuntu新增和設定開機自動啟動程式的方法

                2018-02-01  幸福人生h... &nb

SuSE 設定開機自動啟動程式

在/etc/init.d/boot.local檔案中新增命令。RedHat系統的對應檔案是/etc/rc.d/rc.local。對於Linux系統啟動時自動執行的命令或程式,在rh-basedlinux系統,一般常見是放在/etc/rc.d/rc.local中。但SuSEL

Inno Setup 打包exe設定程式開機自動啟動

第一種方法:不修改登錄檔 原理是將程式的快捷方式新增到計算機"啟動"資料夾,win7可以 win10沒試過 [Tasks] Name: "startupicon"; Description: "開機啟動"; GroupDescription: "{cm:AdditionalI

如何讓程式開機自動啟動

當我們在window下編寫自己的程式時,也可以讓自己編寫的程式在電腦開機時自動執行,這主要是修改windows裡的登錄檔資訊,所有開機自動啟動的程式的一些資訊都放在登錄檔中的某一資料夾下。我們只需在特定的資料夾下寫入我們的程式資訊即可。 關於登錄檔  我們可以在鍵盤上同時按

linux驅動模組開機自動載入,以及應用程式開機啟動

第一種方法:相對來說簡單 將測試程式放在/bin底下,然後用vi編輯/etc/init.d/rcS,加上/bin/應用程式名 &,加上&表示後臺執行 這兩個功能的實現都是通過設定啟動指令碼來實現的。啟動指令碼的一般存放路徑是 /etc/init.d/rc

樹莓派開機自動啟動程式

國外的網站上看到有人說,rc.local不能保證每次都正常執行,比較穩妥的方法是在/etc/init.d裡面執行。這點也請後來的網友指點了。 於是把上面的指令碼挪到/etc/init.d/目錄下, sudo chmod 755/etc/init.d/programn

將一個php 程式 新增到linux開機自動啟動

最近遇到一個問題,有一個php的程式需要開機自動啟動,網上主要的有3種辦法,我試了2種 (1)編輯“/etc/rc.local”,把啟動程式的shell命令輸入進去即可(要輸入命令的全路徑),結果失

Openwrt下設定程式開機自動啟動

轉自http://www.cnyubin.com/?p=364 今天在使用Openwrt時,需要將scp到上面的程式設定為開機自動啟動。按照Linux下設定自動啟動的方法並不有效。後來在官方wiki下發現了介紹文章,具體可見Openwrt下http://wiki.ope

ubuntu mate 開機自動啟動ssh服務

開機自動啟動 css top con runlevel clas ubun files init 在文件/etc/init/ssh.conf中,有一句 start on filesystem or runlevel [2345] 如果想關閉自動啟動的話,把這一局修改為sta

nginx 設置開機自動啟動腳本

nginx 設置開機自動啟動腳本Nginx 是一個很強大的高性能Web和反向代理服務器。雖然使用命令行可以對nginx進行各種操作,比如啟動等,但是還是根據不太方便。下面介紹在Linux下安裝後,如何設置開機自啟動。首先,在linux系統的/etc/init.d/目錄下創建nginx文件,使用如下命令:vim

設置 msyql php-fpm 開機自動啟動腳本

設置 msyql php-fpm 開機自動啟動腳本II 設置MySQL開機啟動1、將mysql安裝目錄下 support-files目錄下的mysql.server文件拷貝到/etc/init.d/目錄下並改名為mysqld,並更改權限chmod 775 /etc/init.d/mysqld2、設置開機啟動

Windows開機自動啟動VirtualBox(以無界面方式啟動)-虛擬機

自動 com blog 移動 pan color tar box 文件夾 windows 開機啟動 虛擬機 (以無界面方式啟動)桌面上出現了一個快捷方式, 右鍵快捷方式 -- 屬性, 在目標中添加 --type headless表示"無界面啟動" http://www.cn