笑傲人生大舞台 發表於 2023-8-2 00:00:00

Linux系统下利用C程序输出某进程的内存占用信息

<p>
        <span><strong>前言</strong></span></p>
<p>
        大家应该都遇到过一种情况,在实际工作中有时需要程序打印出某个进程的内存占用情况以作参考, 下面介绍一种通过Linux下的伪文件系统 /proc 计算某进程内存占用的程序实现方法.下面话不多说了,来一起看看详细的介绍吧。</p>
<p>
        <span><strong>实现分析</strong></span></p>
<p>
        首先, 为什么会有所谓的 伪文件 呢. Linux系统的文件类型大致可分为三类: 普通文件, 目录文件和伪文件. 伪文件不是用来存储数据的, 因此这些文件不占用磁盘空间, 只是存在于内存中. /proc 让你可以与内核内部数据进行交互, 获取有关进程的有用信息.</p>
<p>
        下面主要介绍一下 /proc 下面的四个文件: <code>/proc/stat</code> , <code>/proc/meminfo </code>, <code>/proc/&lt;pid&gt;/stat </code>, <code>/proc/&lt;pid&gt;/status </code>.</p>
<p>
        /proc/stat 存放系统的cpu时间, 该文件包含了所有cpu活动的信息.</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterplain" id="highlighter_786625">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="plain plain">cpu 72389 2891 16811 1148664 31374 0 67 0 0 0</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="plain plain">cpu0 17608 452 3786 288899 6210 0 30 0 0 0</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="plain plain">cpu1 18724 926 4598 285844 8911 0 15 0 0 0</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="plain plain">cpu2 16803 658 3726 288710 7220 0 7 0 0 0</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="plain plain">cpu3 19254 855 4700 285209 9032 0 13 0 0 0</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="plain plain">...</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="plain plain">...</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="plain plain">...</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <code>/proc/meminfo </code>存放系统的内存信息, 通过文件中各个变量的名字便可知其代表的信息.</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_303108">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">MemTotal: 4046236 kB</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">MemFree:  1054440 kB</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">MemAvailable: 2460060 kB</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">Buffers:  359688 kB</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">Cached:  1158056 kB</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash plain">SwapCached:  0 kB</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">Active:  2020096 kB</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="bash plain">Inactive:  677948 kB</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="bash plain">Active(anon): 1181376 kB</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                         </div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="bash plain">...</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="bash plain">...</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="bash plain">...</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <code>/proc/&lt;pid&gt;/stat</code> 存放某个进程的cpu信息</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_183941">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">2476 (firefox) S 1773 1910 1910 0 -1 4210688 3413511 1712 757 1 45466 4629 2 7 20 0 57 0 20381 1774743552 150565 18446744073709551615 94844693012480 94844693126372 140732961864784 140732961858304 139747170914269 0 0 4096 33572079 0 0 0 17 2 0 0 1178 0 0 94844695226592 94844695228536 94844713955328 140732961867643 140732961867668 140732961867668 140732961869791 0</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <code>/proc/&lt;pid&gt;/status</code> 存放某个进程的cpu信息以及一些综合信息</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_327536">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">Name: firefox</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">State: S (sleeping)</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">Tgid: 2476</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">Ngid: 0</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">Pid: 2476</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash plain">PPid: 1773</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">TracerPid: 0</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="bash plain">Uid: 1000 1000 1000 1000</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="bash plain">Gid: 1000 1000 1000 1000</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="bash plain">FDSize: 256</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="bash plain">Groups: 4 24 27 30 46 108 124 1000 </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="bash plain">NStgid: 2476</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="bash plain">NSpid: 2476</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="bash plain">NSpgid: 1910</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="bash plain">NSsid: 1910</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="bash plain">VmPeak: 1722812 kB</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="bash plain">VmSize: 1690920 kB</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="bash plain">VmLck:   0 kB</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="bash plain">VmPin:   0 kB</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="bash plain">VmHWM: 684048 kB</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="bash plain">VmRSS: 600324 kB</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="bash plain">VmData: 993040 kB</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="bash plain">VmStk:  192 kB</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="bash plain">...</code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="bash plain">...</code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="bash plain">...</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        以上数据都可以通过文件读取的方式来获取. 根据自己实验的需要可以计算相应的数据, 比如 <code>pmem = VmRSS/MemTotal*100 </code>等等.</p>
<p>
        <span><strong>示例代码</strong></span></p>
<p>
        下面只是贴出一个简单的获取某进程当前时刻所占用的实际内存的c代码实现例子.</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_764030">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                        <div class="line number41 index40 alt2">
                                                                41</div>
                                                        <div class="line number42 index41 alt1">
                                                                42</div>
                                                        <div class="line number43 index42 alt2">
                                                                43</div>
                                                        <div class="line number44 index43 alt1">
                                                                44</div>
                                                        <div class="line number45 index44 alt2">
                                                                45</div>
                                                        <div class="line number46 index45 alt1">
                                                                46</div>
                                                        <div class="line number47 index46 alt2">
                                                                47</div>
                                                        <div class="line number48 index47 alt1">
                                                                48</div>
                                                        <div class="line number49 index48 alt2">
                                                                49</div>
                                                        <div class="line number50 index49 alt1">
                                                                50</div>
                                                        <div class="line number51 index50 alt2">
                                                                51</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp comments">//get_mem.h</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdlib.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdlib.h&gt;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt; </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;assert.h&gt;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp preprocessor">#define VMRSS_LINE 21//VMRSS所在行, 注:根据不同的系统,位置可能有所区别.</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp preprocessor">#define pid_t int</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">get_phy_mem(</code><code class="cpp keyword bold">const</code> <code class="cpp plain">pid_t p)</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">file = {0};</code><code class="cpp comments">//文件名</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">FILE</code> <code class="cpp plain">*fd;   </code><code class="cpp comments">//定义文件指针fd</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">line_buff = {0}; </code><code class="cpp comments">//读取行的缓冲区</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">sprintf</code><code class="cpp plain">(file,</code><code class="cpp string">"/proc/%d/status"</code><code class="cpp plain">,p);</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code> <code class="cpp plain">(stderr, </code><code class="cpp string">"current pid:%d\n"</code><code class="cpp plain">, p);</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">fd = </code><code class="cpp functions bold">fopen</code> <code class="cpp plain">(file, </code><code class="cpp string">"r"</code><code class="cpp plain">); </code><code class="cpp comments">//以R读的方式打开文件再赋给指针fd</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">//获取vmrss:实际物理内存占用</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i;</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">name;</code><code class="cpp comments">//存放项目名称</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">vmrss;</code><code class="cpp comments">//存放内存</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">//读取VmRSS这一行的数据</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(i=0;i&lt;VMRSS_LINE-1;i++)</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp color1 bold">char</code><code class="cpp plain">* ret = </code><code class="cpp functions bold">fgets</code> <code class="cpp plain">(line_buff, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(line_buff), fd);</code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code><code class="cpp plain">* ret1 = </code><code class="cpp functions bold">fgets</code> <code class="cpp plain">(line_buff, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(line_buff), fd);</code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">sscanf</code> <code class="cpp plain">(line_buff, </code><code class="cpp string">"%s %d"</code><code class="cpp plain">, name,&amp;vmrss);</code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code> <code class="cpp plain">(stderr, </code><code class="cpp string">"====%s:%d====\n"</code><code class="cpp plain">, name,vmrss);</code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">fclose</code><code class="cpp plain">(fd);  </code><code class="cpp comments">//关闭文件fd</code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">vmrss;</code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">get_rmem(pid_t p)</code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">get_phy_mem(p);</code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">get_total_mem()</code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code><code class="cpp plain">* file = </code><code class="cpp string">"/proc/meminfo"</code><code class="cpp plain">;</code><code class="cpp comments">//文件名</code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">FILE</code> <code class="cpp plain">*fd;   </code><code class="cpp comments">//定义文件指针fd</code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">line_buff = {0}; </code><code class="cpp comments">//读取行的缓冲区</code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">fd = </code><code class="cpp functions bold">fopen</code> <code class="cpp plain">(file, </code><code class="cpp string">"r"</code><code class="cpp plain">); </code><code class="cpp comments">//以R读的方式打开文件再赋给指针fd</code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">//获取memtotal:总内存占用大小</code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i;</code>
</div>
                                                                <div class="line number44 index43 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">name;</code><code class="cpp comments">//存放项目名称</code>
</div>
                                                                <div class="line number45 index44 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">memtotal;</code><code class="cpp comments">//存放内存峰值大小</code>
</div>
                                                                <div class="line number46 index45 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code><code class="cpp plain">*ret = </code><code class="cpp functions bold">fgets</code> <code class="cpp plain">(line_buff, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(line_buff), fd);</code><code class="cpp comments">//读取memtotal这一行的数据,memtotal在第1行</code>
</div>
                                                                <div class="line number47 index46 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">sscanf</code> <code class="cpp plain">(line_buff, </code><code class="cpp string">"%s %d"</code><code class="cpp plain">, name,&amp;memtotal);</code>
</div>
                                                                <div class="line number48 index47 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code> <code class="cpp plain">(stderr, </code><code class="cpp string">"====%s:%d====\n"</code><code class="cpp plain">, name,memtotal);</code>
</div>
                                                                <div class="line number49 index48 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">fclose</code><code class="cpp plain">(fd);  </code><code class="cpp comments">//关闭文件fd</code>
</div>
                                                                <div class="line number50 index49 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">memtotal;</code>
</div>
                                                                <div class="line number51 index50 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        测试文件:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_964540">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include "get_mem.h"</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main()</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp plain">{</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">list;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp keyword bold">for</code><code class="cpp plain">(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">i = 0; i &lt; 1024; i++)</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">list = i;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">mem = get_rmem(getpid());</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                         </div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <span><strong>总结</strong></span></p>
<p>
        以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
        原文链接:http://www.linuxidc.com/Linux/2017-12/149850.htm</p>
頁: [1]
查看完整版本: Linux系统下利用C程序输出某进程的内存占用信息