qtopia2.2和Qt4的切换。


/*
    此程序乃是专门测试qtopia2.2切换Qt4.8.5运行测试代码。
    通用友善之臂4412开发版反向学习,以SMPlayer为例
    在/opt/Qtopia/bin目录下有smplayer程序,此程序是基于Qtopia2.2的,
    而在/bin/目录下有smplayer运行脚本和smplayer-bin基于Qt4运行文件。
    smplayer脚本内容
     .setqt4env
    export HOME=/root/Documents/test-videos
    /bin/smplayer-bin -qws
    hotplug
若想运行自己的程序,可以用smplayer搭建的现有的桥。
    修改/bin/xxxxxx -qws即可
    还有想办法把在建设一条桥,就是制作/opt/Qtopia/bin/目录下运行程序,这个程序启动/bin/smplayer这样脚本,关键要实现两点:1、可以要切换Qt4,并且不受qtopia影响,现在在命令行模式,运行Qt4程序,但是后台qtopia会响应鼠标和键盘时间,显示也会刷新,2、Qt4程序退出,返回qtopia,界面显示无残留


    2019年8月23日    nankon
*/

 


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>


union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};

/*
struct sembuf
{
    short sem_num;
    short sem_op;
    short sem_flg;

};
*/

int init_sem(int sem_id,int init_value)
{
    union semun sem_union;
    sem_union.val=init_value;
    if(semctl(sem_id,0,SETVAL,sem_union)==-1)
    {
        perror("Initialize semaphore");
        return -1;
    }
    return 0;
}

int del_sem(int sem_id)
{
    union semun sem_union;
    if(semctl(sem_id,0,IPC_RMID,sem_union)==-1)
    {
        perror("delete semaphore");
        return -1;
    }
}

int sem_p(int sem_id)
{
    struct sembuf sem_b;
    sem_b.sem_num=0;
    sem_b.sem_op=-1;
    sem_b.sem_flg=SEM_UNDO;
    if(semop(sem_id,&sem_b,1)==-1)
    {
        perror("P Operation");
        return -1;
    }
    return 0;
}

int sem_v(int sem_id)
{
    struct sembuf sem_b;
    sem_b.sem_num=0;
    sem_b.sem_op=1;
    sem_b.sem_flg=SEM_UNDO;
    if(semop(sem_id,&sem_b,1)==-1)
    {
        perror("V Operation");
        return -1;
    }
    return 0;
}


int getqpepidstring(char *name)
{

    system("pidof qpe >/tmp/pid");
    
    FILE *file;
    file=fopen("/tmp/pid","r");
    if(file==NULL)
    {
        printf("no qpe pid");
        return -1;
    }
    else
    {
        fread(name,sizeof(name),1,file);
    
        fclose(file);
        printf("qpepid:%s\n",name);
        return 1;
    }
    

}

int main()
{
    pid_t fpid;
    int count=0;
    int sem_id;
    sem_id=semget(ftok(".",'a'),1,0666|IPC_CREAT);
    init_sem(sem_id,0);
    fpid=fork();
    if(fpid<0)
    {
        printf("error in fork!\n");
    }
    else if(fpid==0)
    {
        printf("sonpid:%d\n",getpid());
        char name[100]={0};
        int ret=getqpepidstring(name);
        if(ret==1)
        {
            char pidstring[100]="kill  ";
            strcat(pidstring,name);
            system(pidstring);
            printf("stopqpe:%s\n",pidstring);
        }    
        system("/bin/examclient ");//添加自己的Qt程序
        count++;
        sem_v(sem_id);
    
    }
    else
    {


        sem_p(sem_id);
        printf("fatherpid:%d\n",getpid());
        count++;
        sem_v(sem_id);
        del_sem(sem_id);
        system("qtopia &");
        /*
        char name[100]={0};
                int ret=getqpepidstring(name);
                if(ret==1)
                {
                        char pidstring[100]="kill -CONT ";
                        strcat(pidstring,name);
                        system(pidstring);
                        printf("startqpe:%s\n",pidstring);
                }
        */

    }
    printf("count:%d\n",count);
    return 0;
}

 

 

亲测有效,和友善之臂的qtopia和Qt4有所不同,是关闭了qpe程序,然后在打开qtopia程序,本来想着暂停qpe,使用kill -STOP pid,等软件退出时在恢复qpe进程,但是恢复qpe时,界面无法刷新,如果解决了这个刷新问题,应该和友善之臂这段未开源的代码一样。因无法解决界面刷新问题,只好退而求其次,qpe桌面程序,在重新打开qtopia。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值