2017-05-09 77 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只會創建一個進程...請確認。 –