/*
此程序乃是专门测试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。