免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 17482 | 回复: 10
打印 上一主题 下一主题

[进程管理] 线程中fork进程提示【Cannot allocate memory】是否与线程库相关? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-24 16:54 |显示全部楼层 |倒序浏览
系统环境:linux2.6.37
硬件环境:ARM架构

问题描述:
嵌入式应用层采用多线程结构实现,现在一个功能需要另外起来一个进程实现(就是通过shell起来一个进程),调用fork&execl的形式实现,但是在fork的时候总是提示失败,把错误号打出来是这样的:Cannot allocate memory。

但是移植到另外一个平台上面可以运行正常,可以实现需要功能。

将有问题的平台以“平台A”表示,整成的以“平台B表示”

两个平台硬件结构不同,线程库不同(这个我比较怀疑)。

平台A:uclib
平台B:glib

注:我写了一个demo在平台A上面运行(直接调用fork启动进程),没有问题


为了在所有的平台上面都能实现功能,目前我采用两个线程来实现的,一个线程直接调用system来启动进程,另外一个进程来维护这个进程(通过进程名拿到进程id,如果获取id失败,认为进程退出了),检测这个进程是否退出,然后进行相关操作,但是这样的设计肯定有问题,因为可能会启动很多个类似的进程,如果出现相同进程名的进程就有问题了。


网上查了很多资料,好像都没有给出好的回答和解决方案,目前都还不知道到底是否是线程库的问题。


有没有兄弟遇到过类似的情况,望分享下经验哇,3Q

论坛徽章:
0
2 [报告]
发表于 2014-05-26 20:07 |显示全部楼层
回复 2# humjb_1983






不好意思,这两天公司事情比较多

这个我当时看多,free mem还高达48M,所以这个应该没有问题

   

论坛徽章:
0
3 [报告]
发表于 2014-05-28 18:25 |显示全部楼层
大富大贵兄,你好
/ # cat /proc/meminfo
MemTotal:         125172 kB
MemFree:           45992 kB
Buffers:           10128 kB
Cached:            42332 kB
SwapCached:            0 kB
Active:            29932 kB
Inactive:          42584 kB
Active(anon):      20056 kB
Inactive(anon):       32 kB
Active(file):       9876 kB
Inactive(file):    42552 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         20072 kB
Mapped:             6600 kB
Shmem:                32 kB
Slab:               3528 kB
SReclaimable:       1256 kB
SUnreclaim:         2272 kB
KernelStack:        1032 kB
PageTables:          980 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      112652 kB
Committed_AS:      57368 kB
VmallocTotal:     778240 kB
VmallocUsed:        4692 kB
VmallocChunk:     765948 kB



/proc/sys/vm # cat overcommit_memory
2


以上为该平台的打印

请问你觉得该问题是否与线程库的实现机制有关?

uclib线程库是否不能在线程里面fork进程?

论坛徽章:
0
4 [报告]
发表于 2014-05-28 18:25 |显示全部楼层
回复 4# humjb_1983


    大富大贵兄,你好
/ # cat /proc/meminfo
MemTotal:         125172 kB
MemFree:           45992 kB
Buffers:           10128 kB
Cached:            42332 kB
SwapCached:            0 kB
Active:            29932 kB
Inactive:          42584 kB
Active(anon):      20056 kB
Inactive(anon):       32 kB
Active(file):       9876 kB
Inactive(file):    42552 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         20072 kB
Mapped:             6600 kB
Shmem:                32 kB
Slab:               3528 kB
SReclaimable:       1256 kB
SUnreclaim:         2272 kB
KernelStack:        1032 kB
PageTables:          980 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      112652 kB
Committed_AS:      57368 kB
VmallocTotal:     778240 kB
VmallocUsed:        4692 kB
VmallocChunk:     765948 kB



/proc/sys/vm # cat overcommit_memory
2


以上为该平台的打印

请问你觉得该问题是否与线程库的实现机制有关?

uclib线程库是否不能在线程里面fork进程?

论坛徽章:
0
5 [报告]
发表于 2014-06-03 10:44 |显示全部楼层
回复 8# guobamantou


    嗯,当时我使用vfork试过,vfork调用的结果一样,还是一样的提示不能分配内存~~~

论坛徽章:
0
6 [报告]
发表于 2014-06-03 10:45 |显示全部楼层
回复 7# humjb_1983


   /proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存(参照overcommit_ratio)。


应该在2的时候才有可能成功吧?如果是0 ,那不是申请不到就直接失败了么?



   

论坛徽章:
0
7 [报告]
发表于 2014-07-10 14:12 |显示全部楼层
回复 11# humjb_1983


    不好意思,之前帐号名记错了一直登录不了,今天试了下是之前把下划线记成点了,郁闷

/ #
/ # cat /proc/meminfo
MemTotal:         125172 kB
MemFree:           54036 kB
Buffers:            9156 kB
Cached:            37484 kB
SwapCached:            0 kB
Active:            24592 kB
Inactive:          39216 kB
Active(anon):      17168 kB
Inactive(anon):       32 kB
Active(file):       7424 kB
Inactive(file):    39184 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         17184 kB
Mapped:             5460 kB
Shmem:                32 kB
Slab:               3680 kB
SReclaimable:       1160 kB
SUnreclaim:         2520 kB
KernelStack:         896 kB
PageTables:          876 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      112652 kB
Committed_AS:      53996 kB
VmallocTotal:     778240 kB
VmallocUsed:        4988 kB
VmallocChunk:     765948 kB
/ #
/ # cat /proc/sys/vm/overcommit_memory
2
/ # cat /proc/sys/vm/overcommit_ratio
90
/ #
/ # free
             total         used         free       shared      buffers
Mem:        125172        71144        54028            0         9156
-/+ buffers:              61988        63184
Swap:            0            0            0
/ #


大富大贵兄,上面红色表示就是设备当前最大可用虚拟内存吧,紫色就是表示已经使用的虚拟内存吧?   目测剩余space还挺多的啊。

论坛徽章:
0
8 [报告]
发表于 2014-07-10 14:15 |显示全部楼层
回复 11# humjb_1983


    因为当前环境是嵌入式环境,所以很多东西我自己也改不了,没有/etc/sysctl.conf文件。

请问还有什么其他方法来修改这个数值吗?

/etc #
/etc # pwd
/etc
/etc # ls -l
-rwxrwxrwx    1 root     root          2870 Mar  5 10:51 S_udev
-rwxrwxrwx    1 root     root             7 Sep  9  2011 TZ
drwxrwxrwx    2 root     root             0 Mar 26 03:02 dropbear
-rwxrwxrwx    1 root     root            35 Sep  9  2011 group
-rwxrwxrwx    1 root     root             0 Sep  9  2011 hosts
-rwxrwxrwx    1 root     root           265 Jan  6  2014 inetd.conf
-rwxrwxrwx    1 root     root           329 Jan  7  2014 inittab
-rwxrwxrwx    1 root     root            82 Jul 10 03:48 passwd
-rwxrwxrwx    1 root     root            83 Sep  9  2011 passwd_nfs
-rwxrwxrwx    1 root     root          1508 Mar  5 10:51 profile
-rwxrwxrwx    1 root     root            40 Jul 10 03:48 resolv.conf
-rwxrwxrwx    1 root     root           362 Sep  9  2011 services
drwxrwxrwx    3 root     root             0 Jul 25  2012 udev
-rwxrwxrwx    1 root     root           226 Sep  9  2011 udev.conf

论坛徽章:
0
9 [报告]
发表于 2014-07-10 15:05 |显示全部楼层
回复 14# humjb_1983




修改过后,在开启应用程序,ok,没有fork失败。

感谢大富大贵兄的帮助。

1016 root      268m S    {openplatform_de} /home/centaurus
1017 root      1080 S    sh -c openplatform_demo
1018 root       668 S    openplatform_demo
1019 root       668 S    openplatform_demo
1020 root       668 S    openplatform_demo
1021 root       668 S    openplatform_demo
1022 root       668 S    openplatform_demo

程序已经启动!
  1.         if((pid = fork())<0)
  2.         {
  3.                 PSIA_EXP_DBG(SYS_ERROR, "%s fork  [%s]!!!\n", __FUNCTION__, strerror(errno));
  4.                 (void)fresh_app_runstatus(FALSE, appname_tmp);
  5.                 status = -1;
  6.         }
  7.         else if(pid == 0)
  8.         {
  9.                 execl("/bin/sh", "sh", "-c", appname_tmp, (char *)0);
  10.                 exit(127); //子进程正常执行则不会执行此语句
  11.         }
复制代码
上面代码启动进程,为什么还是会出现启动一个shell去执行程序呢(sh -c那个东西)? 难道是execl函数选错了?
      

论坛徽章:
0
10 [报告]
发表于 2014-07-10 15:27 |显示全部楼层
回复 16# humjb_1983


我执行的程序是一个可执行程序,不是shell脚本0,可执行程序放在flash中,通过软件接搞出来的一个命令,就是程序里面的appname_tmp

期望的是直接启动一个进程,而不需要sh -c这个东西。
  1.         if((pid = fork())<0)
  2.         {
  3.                 PSIA_EXP_DBG(SYS_ERROR, "%s fork  [%s]!!!\n", __FUNCTION__, strerror(errno));
  4.                 (void)fresh_app_runstatus(FALSE, appname_tmp);
  5.                 status = -1;
  6.         }
  7.         else if(pid == 0)
  8.         {
  9.                 execvp(appname_tmp, (char *)0);
  10.                 exit(127); //子进程正常执行则不会执行此语句
  11.         }
复制代码
这样搞,把execl改为execvp就行了。

  321 root      268m S    {openplatform_de} /home/centaurus
  322 root       668 S    [openplatform_de]
  323 root       668 S    [openplatform_de]
  324 root       668 S    [openplatform_de]
  325 root       668 S    [openplatform_de]
  326 root       668 S    [openplatform_de]



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP