GVKun编程网logo

Android 检测和监听当前 USB 设备 VID/PID(android 监听usb拔插)

1

以上就是给各位分享Android检测和监听当前USB设备VID/PID,其中也会对android监听usb拔插进行解释,同时本文还将给你拓展/proc/[pid]/pagemaps和/proc/[pi

以上就是给各位分享Android 检测和监听当前 USB 设备 VID/PID,其中也会对android 监听usb拔插进行解释,同时本文还将给你拓展/ proc / [pid] / pagemaps和/ proc / [pid] / maps | linux、/var/run/yum.pid 已被锁定,PID 为 xxx 的另一个程序正在运行、/var/run/yum.pid 已被锁定,PID 为 XXXXX 的另一个程序正在运行、Airflow SSH 在警告后收到 SIGTERM:Recorded pid 1098 与当前的 pid 31631 不匹配等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Android 检测和监听当前 USB 设备 VID/PID(android 监听usb拔插)

Android 检测和监听当前 USB 设备 VID/PID(android 监听usb拔插)

在 APP 中使用:

检测当前连接设备是否有对应的 VID/PID

private boolean isCurrentDeviceConnected(){
        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
        HashMap<String, UsbDevice> usbList = manager.getDeviceList();
        for(String key: usbList.keySet()){
            UsbDevice usbDevice = usbList.get(key);
            if(usbDevice != null && usbDevice.getProductId() == 10304 && usbDevice.getVendorId() == 1060){
                return true;
            }
        }
        return false;
    }

监听 USB 设备插入和拔出

IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(mUsbStateChangeReceiver, filter);
private final BroadcastReceiver mUsbStateChangeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();

            UsbDevice usbDevice = (UsbDevice)intent.getExtras().get("device");
            if(usbDevice != null && usbDevice.getProductId() == 10304 && usbDevice.getVendorId() == 1060){
                if(action == UsbManager.ACTION_USB_DEVICE_ATTACHED){
                   
                }else if(action == UsbManager.ACTION_USB_DEVICE_DETACHED){

                }
            }
        }
    };

 

在 frameworks 中使用:

需要修改 frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

1. 在原来的 ACTION_USB_DEVICE_ATTACHED receiver 中添加自己需要检测的 VID PID 的代码

BroadcastReceiver hostReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Iterator devices = ((UsbManager) context.getSystemService(Context.USB_SERVICE))
                        .getDeviceList().entrySet().iterator();
                if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
                    mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, true);
                    if(need) {
                        UsbDevice usbDevice = (UsbDevice)intent.getExtras().get("device");
                        if(usbDevice != null && usbDevice.getProductId() == CRADLE_MONITOR_PID
                                && usbDevice.getVendorId() == CRADLE_MONITOR_VID) {
                            handleCradleConnected(true);
                        }
                    }
                } else {
                    mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, false);
                    if(need) {
                        UsbDevice usbDevice = (UsbDevice)intent.getExtras().get("device");
                        if(usbDevice != null && usbDevice.getProductId() == CRADLE_MONITOR_PID
                                && usbDevice.getVendorId() == CRADLE_MONITOR_VID) {
                            handleCradleConnected(false);
                        }
                    }
                }
            }
        };

2. 添加直接检测当前是否已经连接的 code

private boolean isCradleConnected(){
        UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
        HashMap<String, UsbDevice> usbList = manager.getDeviceList();
        for(String key: usbList.keySet()){
            UsbDevice usbDevice = usbList.get(key);
            if(usbDevice != null && usbDevice.getProductId() == CRADLE_MONITOR_PID
                    && usbDevice.getVendorId() == CRADLE_MONITOR_VID){
                return true;
            }
        }
        return false;
    }

3. 在 MSG_BOOT_COMPLETED 开机完成的 message 再去呼叫步骤 2 里面的 function 去做初始化检测

注意:不能在 UsbDeviceManager 的构造函数里面去呼叫步骤 2 的 function,此时系统初始化未完成,会造成无法开机!

/ proc / [pid] / pagemaps和/ proc / [pid] / maps | linux

/ proc / [pid] / pagemaps和/ proc / [pid] / maps | linux

我正在努力弄清标题中提到的两个文件。我查了一下是什么。但是,我无法理解如何从他们那里提取有用的信息(或者我只是以错误的方式来对待)。

让我解释一下:页面映射是一个相当新的“功能”伪文件,其中包含分配给当前[pid]的虚拟页面的物理框架信息。也就是说,给定一个从地址x开始的虚拟页面,比如说“
vas”代表虚拟地址开始,我可以使用vas为页面地图文件建立索引,以获取映射的物理页面框架的64位。这些位包含有关该虚拟页面的信息。但是,当我提取位并进行一些移位时,我会迷失于所见。

这些位表示如下:0-54是页面帧号,55-60是页面移位,63rd位是当前位,还有其他一些我不太感兴趣的位。在使用/ proc / [pid] /
maps中的vas地址进行了一些映射之后,似乎几乎每个进程的页面都被交换了,即,第63位始终为零。:(

我想问题是,我应该如何有效地使用页面映射来获取/ proc / [pid] / maps给定地址的等效物理地址

公平地说,我已经发布了一个类似的问题,但是前几天的方法有所不同。

如果有人能对此事有所启发,我将不胜感激。

===编辑===

要解决以下评论:我正在从/ proc / [pid] / maps中读取一行,这些行如下所示:

00400000-00401000 r-xp 00000000 08:01 8915461 / home / janjust / my_programs
/ shared_mem 7ffffef1b000-7ffffef3c000 rw-p 00000000 00:00 0 [堆栈]

然后,我提取它接触的虚拟页面的数量并为二进制文件/ proc / [pid] /
pagemaps编制索引,对于每个虚拟页面,我都可以提取分配给它的物理页面。

输出如下:

00400000-00401000 r-xp 00000000 08:01 8915461 / home / janjust / my_programs
/ shared_mem num_pages:1:86000000001464C6

虚拟范围内每个虚拟页面的一个物理地址。

用于读取行并提取物理地址的代码是:

74     /* process /proc/pid/maps, by line*/75     while(fgets(line, 256, in_map) != NULL){76         unsigned long vas;77         unsigned long vae;78         int num_pages;79 80         //print line81         printf("%s", line);82 83         /*scan for the virtual addresses*/84         n = sscanf(line, "%lX-%lX", &vas, &vae);85         if(n != 2){86             printf("Involid line read from %s\n",maps);87             continue;88         }89 90         num_pages = (vae - vas) / PAGE_SIZE;91         printf("num_pages: %d\n", num_pages);92 93         if(num_pages > 0){94             long index  = (vas / PAGE_SIZE) * sizeof(unsigned long long);95             off64_t o;96             ssize_t t;97 98             /* seek to index in pagemaps */99             o = lseek64(pm, index, SEEK_SET);100             if (o != index){101                 printf("Error seeking to o:%ld, index:%ld.\n", o, index);102             }103 104             /* map the virtual to physical page */105             while(num_pages > 0){106                 unsigned long long pa;107 108                 /* Read a 64-bit word from each pagemap file... */109                 t = read(pm, &pa, sizeof(unsigned long long));110                 if(t < 0){111                     printf("Error reading file \"%s\" \n", page_map);112                     goto next_line;113                 }114                 printf(": %016llX\n", pa);

但是,尽管我认为我得到了正确的输出,但是索引似乎是类型不匹配或正在发生其他事情:例如,输出表示地图中的[shared
mem]行给出了错误的索引;但是我仍然能够浏览二进制文件并获取物理页面地址。

该输出的示例如下:

969 7f7f08d58000-7f7f08d59000 rw-s 00000000 00:04 0    /SYSV00003039 (deleted)970 num_pages: 1971 Error seeking to o:-1081840960, index:273796065984.972 : 8600000000148267

好的,现在,最后我应该说这是在64位操作系统下,并且此问题在32位操作系统中不会持续存在。

答案1

小编典典

噢,K,索引是正确的,但是将off64_t
o(8bytes)与长索引进行比较会解释o错误,因此为什么我会收到该错误。哈!这是一个愚蠢的错误。因此,添加适当的标头就可以了。

缺少标题:-/ 叹气 解决了将off64_t与无符号long比较的问题。

/var/run/yum.pid 已被锁定,PID 为 xxx 的另一个程序正在运行

/var/run/yum.pid 已被锁定,PID 为 xxx 的另一个程序正在运行

问题:已加载插件: fastestmirror,security

/var/run/yum.pid 已被锁定,PID 为 1610 的另一个程序正在运行

 

解决方法:删除 yum.pid 文件( rm -rf /var/run/yum.pid),再次运行 yum 命令

 

/var/run/yum.pid 已被锁定,PID 为 XXXXX 的另一个程序正在运行

/var/run/yum.pid 已被锁定,PID 为 XXXXX 的另一个程序正在运行

删除jdk时终端提示

/var/run/yum.pid已被锁定,PID 为 XXXXX 的另一个程序正在运行

解决方法:

直接在终端运行 rm -f/var/run/yum.pid 将该文件删除,然后再次运行yum





问题再现:





[root@localhostzjy]# yum -y remove java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64

已加载插件:langpacks,product-id,search-disabled-repos,subscription-manager

This system is notregistered to Red Hat Subscription Management. You can use subscription-managerto register.

/var/run/yum.pid 已被锁定,PID 36637 的另一个程序正在运行。

Another app iscurrently holding the yum lock; waiting for it to exit...

另一个应用程序是:yum

内存: 80 M RSS 441 MB VSZ

已启动: Sun Jan 7 19:29:40 2018 -02:55之前

状态 :跟踪/停止,进程ID36637

Another app iscurrently holding the yum lock; waiting for it to exit...

另一个应用程序是:yum

内存: 80 M RSS 441 MB VSZ

已启动: Sun Jan 7 19:29:40 2018 -02:57之前

状态 :跟踪/停止,进程ID36637

Another app iscurrently holding the yum lock; waiting for it to exit...

另一个应用程序是:yum

内存: 80 M RSS 441 MB VSZ

已启动: Sun Jan 7 19:29:40 2018 -02:59之前

状态 :跟踪/停止,进程ID36637

Another app iscurrently holding the yum lock; waiting for it to exit...

另一个应用程序是:yum

内存: 80 M RSS 441 MB VSZ

已启动: Sun Jan 7 19:29:40 2018 -03:01之前

状态 :跟踪/停止,进程ID36637

Another app iscurrently holding the yum lock; waiting for it to exit...

另一个应用程序是:yum

内存: 80 M RSS 441 MB VSZ

已启动: Sun Jan 7 19:29:40 2018 -03:03之前

状态 :跟踪/停止,进程ID36637

^Z

解决后:





成功!

Airflow SSH 在警告后收到 SIGTERM:Recorded pid 1098 与当前的 pid 31631 不匹配

Airflow SSH 在警告后收到 SIGTERM:Recorded pid 1098 与当前的 pid 31631 不匹配

如何解决Airflow SSH 在警告后收到 SIGTERM:Recorded pid 1098 与当前的 pid 31631 不匹配

我需要一些帮助。

在 docker 容器+LocalExecutor 上运行气流。

Airflow 版本为 2.0.0 (https://pypi.org/project/apache-airflow/2.0.0/)

我正在使用 SSHOperator 的包装器运行一个长时间运行的任务。 基本上,我打开一个 SSH 会话以在 spark 边缘节点中运行 spark-submit 作业。 (YARN JOB 成功但气流任务失败)

任务以 PID 31675 开始:

[2021-06-24 18:29:09,664] {standard_task_runner.py:51} INFO - Started process 31675 to run task

然后在一段时间后收到此警告:

记录的pid 1098与当前pid 31631不匹配

然后任务失败:

[2021-06-24 19:45:44,493] {local_task_job.py:166} WARNING - Recorded pid 1098 does not match the current pid 31631
[2021-06-24 19:45:44,496] {process_utils.py:95} INFO - Sending Signals.SIGTERM to GPID 31675
[2021-06-24 19:45:44,496] {taskinstance.py:1214} ERROR - Received SIGTERM. Terminating subprocesses.
[2021-06-24 19:45:44,528] {taskinstance.py:1396} ERROR - LatamSSH operator error: Task received SIGTERM signal
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/latamairflow/operators/latam_ssh_operator.py",line 453,in execute
    readq,_,_ = select([channel],[],self.timeout)
  File "/usr/local/lib/python3.6/site-packages/airflow/models/taskinstance.py",line 1216,in signal_handler
    raise AirflowException("Task received SIGTERM signal")
airflow.exceptions.AirflowException: Task received SIGTERM signal
During handling of the above exception,another exception occurred:
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/airflow/models/taskinstance.py",line 1086,in _run_raw_task
    self._prepare_and_execute_task_with_callbacks(context,task)
  File "/usr/local/lib/python3.6/site-packages/airflow/models/taskinstance.py",line 1260,in _prepare_and_execute_task_with_callbacks
    result = self._execute_task(context,task_copy)
  File "/usr/local/lib/python3.6/site-packages/airflow/models/taskinstance.py",line 1300,in _execute_task
    result = task_copy.execute(context=context)
  File "/usr/local/lib/python3.6/site-packages/latamairflow/operators/latam_ssh_operator.py",line 502,in execute
    raise AirflowException("LatamSSH operator error: {0}".format(str(e)))
airflow.exceptions.AirflowException: LatamSSH operator error: Task received SIGTERM signal
[2021-06-24 19:45:44,529] {taskinstance.py:1440} INFO - Marking task as Failed.

我们今天的关于Android 检测和监听当前 USB 设备 VID/PIDandroid 监听usb拔插的分享已经告一段落,感谢您的关注,如果您想了解更多关于/ proc / [pid] / pagemaps和/ proc / [pid] / maps | linux、/var/run/yum.pid 已被锁定,PID 为 xxx 的另一个程序正在运行、/var/run/yum.pid 已被锁定,PID 为 XXXXX 的另一个程序正在运行、Airflow SSH 在警告后收到 SIGTERM:Recorded pid 1098 与当前的 pid 31631 不匹配的相关信息,请在本站查询。

本文标签: