TI论坛
直播中

张娜

7年用户 969经验值
私信 关注
[问答]

android系统使用appe播放audio资源,相关进程被kill之后appe无法再次打开的原因?


  • android系统使用appe播放audio资源,相关进程被kill之后appe无法再次打开,原因是appe资源被占用。
    ti提供的demo中,通过 signal(SIGKILL, appe_exit); 来解决程序被kill的时候需要做的资源回收处理,即使用appe_close来释放资源。 但是,如果使用kill -9 来结束任务,这个signal是无法被捕捉到的,所以再次执行appe_open会fail,err原因是资源被占用。
    我已经对TI的demo做了测试,demo捕捉信号如下:
        signal(SIGINT, appe_exit);
        signal(SIGTERM, appe_exit);
        signal(SIGABRT, appe_exit);
        signal(SIGKILL, appe_exit);
        signal(SIGHUP, appe_exit);
    Ctrl + c 以及 kill均能被捕捉到,但是kill -9 不能被捕捉到。
    在android系统中,资源紧张导致server被kill是常见的,由于信号无法捕捉到,再次重入执行appe_open会出现上述错误。
    请帮助分析一下!

回帖(2)

时忠晨

2024-10-23 16:54:01
   可能设备驱动对异常关闭的非初始化状态不能识别或控制, 导致出错了.
举报

河神大人

2024-10-24 11:09:51
在Android系统中,使用appe播放音频资源时,如果相关进程被kill,可能导致appe无法再次打开。这主要是因为appe资源被占用。在TI提供的demo中,通过signal(SIGKILL, appe_exit)来解决程序被kill时需要做的资源回收处理,即使用appe_close来释放资源。但是,如果使用kill -9来结束任务,这个signal是无法被捕捉到的,所以再次执行appe_open会fail,err原因是资源被占用。

为了解决这个问题,我们可以采取以下步骤:

1. 在程序中注册信号处理函数:在程序开始时,注册信号处理函数,以便在接收到特定信号时执行相应的资源回收操作。例如:

```c
signal(SIGINT, appe_exit);
signal(SIGTERM, appe_exit);
signal(SIGABRT, appe_exit);
```

2. 在信号处理函数中释放资源:在appe_exit函数中,调用appe_close来释放资源。例如:

```c
void appe_exit(int sig) {
    // 释放资源
    appe_close();
    // 退出程序
    exit(0);
}
```

3. 处理kill -9信号:由于kill -9信号无法被捕捉,我们需要在程序中定期检查资源占用情况。如果发现资源被占用,可以尝试重新初始化appe资源。例如:

```c
while (1) {
    // 检查资源占用情况
    if (is_resource_occupied()) {
        // 重新初始化appe资源
        appe_reinitialize();
    }
    // 执行其他任务
}
```

4. 优化资源管理:为了避免资源被占用,可以在程序中实现更严格的资源管理策略。例如,确保在不再需要资源时及时释放资源,避免资源泄漏。

通过以上步骤,我们可以在一定程度上解决appe无法再次打开的问题。然而,由于kill -9信号的特殊性,我们可能无法完全避免这个问题。在实际应用中,我们还需要根据具体情况进行调整和优化。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分