加载中…
个人资料
无语僧314
无语僧314
  • 博客等级:
  • 博客积分:0
  • 博客访问:240,055
  • 关注人气:29
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

Android 不支持Linux应用SYSV IPC (转载)

(2016-08-19 17:18:00)
标签:

android

linux

ipc

进程间通讯

分类: 嵌入式Android

Android 不支持 System V IPC, 即下面头文件提供的功能:

   
   
   
   

Android不支持SYSV IPC的原因: 会导致全局的内核资源泄漏。例如,当一个有bug的或恶意程序退出后或普通程序被强行杀死后,没有办法自动释放Sysv信号量(在内核中分配的)。然而Android系统经常自动杀死进程,给新的进程腾出空间(Android的重要机制)。这意味着,即使程序没有bug也不是恶意代码,随时间的推移,进程经常被杀死然后重新创建,内核中用于实现SysV IPC的全局表格会被填满。这个时候,就会发生奇怪的事件并导致使用SysV IPC的程序无法运行,只有重启系统。而且考虑到可能有人会故意写恶意程序,所以Android选择不支持SysV IPC。下面提供一个导致内核资源泄漏的程序(需在Linux系统上运行)作为例证:

 

[cpp] view plain copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7.   
  8.   
  9. #define  NUM_SEMAPHORES  32  
  10. #define  MAX_FAILS       10  
  11.   
  12.   
  13. int  main(void 
  14.  
  15.     int   counter 0;  
  16.     int   fails   0;  
  17.     if (counter == IPC_PRIVATE)  
  18.         counter++;  
  19.     printf( "%d (NUM_SEMAPHORES=%d)\n"counter, NUM_SEMAPHORES);  
  20.     for (;;)  
  21.         int  ret fork();  
  22.         int  status;  
  23.         if (ret 0)  
  24.             perror("fork:");  
  25.             break 
  26.          
  27.         if (ret == 0)  
  28.               
  29.             ret semget( (key_t)counter, NUM_SEMAPHORES, IPC_CREAT );  
  30.             if (ret 0)  
  31.                 return errno;  
  32.              
  33.             return 0;  
  34.          
  35.         else  
  36.               
  37.             ret wait(&status);  
  38.             if (ret 0)  
  39.                 perror("waitpid:");  
  40.                 break 
  41.              
  42.             if (status != 0)  
  43.                 status WEXITSTATUS(status);  
  44.                 fprintf(stderr, "child %d FAIL at counter=%d: %d\n"ret,  
  45.                                 counter, status);  
  46.                 if (++fails >= MAX_FAILS)  
  47.                     break 
  48.              
  49.          
  50.         counter++;  
  51.         if ((counter 1000) == 0)  
  52.             printf("%d\n"counter);  
  53.          
  54.         if (counter == IPC_PRIVATE)  
  55.             counter++;  
  56.      
  57.     return 0;  
  58.  

 

如果上面的程序在当今典型的Linux发行版上编译运行,你会发现该程序将很快地用不同的key_t值占满内核表格,系统将会发生奇怪的事件。但某些Linux系统不一定有该问题(可运行 “ipcs -u” 命令查看内核资源表及资源分配情况)。根据我们的经验,在执行上面程序之后,任何一个程序仅仅调用了 strerror() 就会崩溃。USB子系统不断报告奇怪的错误信息到系统终端等。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有