2017-05-09 103 views
0

我运行在基于ARM的板下面的代码:SH:内存不足的系统调用

sh: out of memory 
StartStreamer: command=[/usr/bin/gst-launch-0.10 imxv4l2src ! imxv4l2sink &], status:256 
Segmentation fault 
Rebooting:35584 
StopStreamer: command=[killall gst-launch-0.10], status = 11 
Rebooting:11 
Loop Count:26 
sh: relocation error: sh: symbol free, version GLIBC_2.4 not defined in file libc.so.6 with link time reference 
sh: relocation error: sh: symbol free, version GLIBC_2.4 not defined in file libc.so.6 with link time reference 
StartStreamer: command=[/usr/bin/gst-launch-0.10 imxv4l2src ! imxv4l2sink &], status:32512 
Rebooting:11 
killall: gst-launch-0.10: no process killed 
StopStreamer: command=[killall gst-launch-0.10], status = 11 
Rebooting:11 
Loop Count:27 
StartStreamer: command=[/usr/bin/gst-launch-0.10 imxv4l2src ! imxv4l2sink &], status:32512 
Rebooting:32512 

可以:

void MainLoop() 
{ 
    char command[256]; 
    int ret = 0; 
    int loopCount = 0; 
    while(1) 
    { 
     memset(command, '\0', sizeof(command)); 
     sprintf(command, "/usr/bin/gst-launch-0.10 imxv4l2src ! imxv4l2sink &"); 
     ret = system(command); 
     printf("StartStreamer: command=[%s], status:%d\n", command, ret); 
     if (ret != 0) 
     { 
      ret = system("reboot"); 
      printf("Rebooting:%d\n", ret); 
     } 
     sleep(15); 
     memset(command, '\0', sizeof(command)); 
     sprintf(command, "killall gst-launch-0.10"); 
     ret = system(command); 
     printf("StopStreamer: command=[%s], status = %d\n", command, ret); 
     if (ret != 0) 
     { 
      ret = system("reboot"); 
      printf("Rebooting:%d\n", ret); 
     } 
     sleep(15); 
     loopCount++; 
     printf("Loop Count:%d\n", loopCount); 

    } 
} 

运行一些随机循环我收到以下错误后你请告诉我什么是“sh:内存不足”,意思是说,是因为系统调用太多。而且,它的奇怪的是我得到glibc重定位错误...

我已经从C应用程序修改为Bash sc RIPT:

#!/bin/ash 
count=0 
    while [ true ];do 
      echo "Starting Streamer" 
     /usr/bin/gst-launch-0.10 imxv4l2src ! imxv4l2sink & 
      sleep 15 
      echo "Stopping Streamer" 
      killall gst-launch-0.10 
      sleep 15 
      count=$((count+1)) 
      echo $count 
    done 

而对于一些循环,我得到以下错误后运行:

*错误/bin/sh': double free or corruption (out): 0x0028ebf8 *** *** Error in/bin/sh的':的malloc():内存破坏:0x0028edf8 *

+1

如果不是您的程序误用了内存,那么它必须是您启动的程序之一,导致该板耗尽内存。 –

+0

你能告诉我检查程序的内存使用情况的命令吗 –

回答

1

Can you please tell me what does "sh: Out of Memory" means, is it because of too many system calls.

system手册页:

The system() library function uses fork(2) to create a child 
    process that executes the shell command specified in command using 
    execl(3) as follows: 

     execl("/bin/sh", "sh", "-c", command, (char *) 0); 

    system() returns after the command has been completed. 

我会说这就是为什么你看到这条消息。你显然已经用尽了fork部分的资源。无论这是进入rlimit还是仅仅在内存中运行(更可能),很难说清楚。

所以基本上你有一个主循环,调用system,“底层”创建你的进程的副本,并将二进制文件(execl部分)复制到副本中。哦,你试图killall第一个过程(再次system)。不幸的是,信号并不能保证是可靠的,但通常会收到。另一个复杂的问题是,你处于调度程序的摆布之中,当你认为它可能不会运行该进程时。

这将会是更好的访问使用更原始的fork/exec功能这一功能 - 至少你有PID到无killall的开销发送信号。

+0

killall与使用PID查杀不同。在前一种情况下,killall正在检索PID .. –

+0

不是。在这种情况下,'killall'是另一个'fork'off(使用更多内存)的进程,它读取进程表,搜索匹配以向PID发送信号(例如,'kill')。 'kill'不'fork',避免开销和内存使用。 – ldav1s

+0

你是说killall与system()创建两个进程,一个是由系统创建的,另一个是killall,而使用system()创建的kill只会创建一个进程...请确认。 –