📄 c-shell3.html
字号:
</dl></dl></dl><font face="Helvetica, sans-serif" class="sans"><h4 class="H3"><i><a name="85322">6.3.9 Ambiguity of Arrays and Pointers</a></i></h4></font><dl class="margin"><dl class="margin"><dd><p class="Body"><a name="85324"> </a>In a C expression, a nonsubscripted reference to an array has a special meaning, namely the address of the first element of the array. The shell, to be compatible, should use the address obtained from the symbol table as the value of such a reference, rather than the contents of memory at that address. Unfortunately, the information that the identifier is an array, like all data type information, is not available after compilation. For example, if a module contains the following:</p><dl class="margin"><dd><pre class="Code2"><b><a name="85325">char string [ ] = "hello";</a></b></pre></dl><dd><p class="Body"><a name="85326"> </a>you might be tempted to enter a shell expression like:</p></dl><dl class="margin"><dd><pre class="Code"><b><a name="85327"><img alt="(1)" src="icons/z1.gif"></b><tt class="output"> -></tt><b> printf (string)</a></b></pre></dl><dl class="margin"><dd><p class="Body"><a name="85328"> </a>While this would be correct in C, the shell will pass the first 4 bytes of the string itself to <b class="routine"><i class="routine">printf</i></b><b>(</b> <b>)</b>, instead of the address of the string. To correct this, the shell expression must explicitly take the address of the identifier:</p></dl><dl class="margin"><dd><pre class="Code"><b><a name="85330"><img alt="(2)" src="icons/z2.gif"></b><tt class="output"> -></tt><b> printf (&string)</a></b></pre></dl><dl class="margin"><dd><p class="Body"><a name="85331"> </a>To make matters worse, in C if the identifier had been declared a character pointer instead of a character array:</p><dl class="margin"><dd><pre class="Code2"><b><a name="85332">char *string = "hello";</a></b></pre></dl><dd><p class="Body"><a name="85333"> </a>then to a compiler <img alt="(1)" src="icons/z1.gif"> would be correct and <img alt="(2)" src="icons/z2.gif"> would be wrong! This is especially confusing since C allows pointers to be subscripted exactly like arrays, so that the value of <b class="symbol_lc">string[0]</b> would be "h" in either of the above declarations.</p><dd><p class="Body"><a name="85334"> </a>The moral of the story is that array references and pointer references in shell expressions are different from their C counterparts. In particular, array references require an explicit application of the address operator <b class="operator">&</b>.</p></dl></dl><font face="Helvetica, sans-serif" class="sans"><h4 class="H3"><i><a name="85336">6.3.10 Pointer Arithmetic</a></i></h4></font><dl class="margin"><dl class="margin"><dd><p class="Body"><a name="85338"> </a>While the C language treats pointer arithmetic specially, the shell C interpreter does not, because it treats all non-type-cast variables as 4-byte integers.</p><dd><p class="Body"><a name="85339"> </a>In the shell, pointer arithmetic is no different than integer arithmetic. Pointer arithmetic is valid, but it does not take into account the size of the data pointed to. Consider the following example:</p><dl class="margin"><dd><pre class="Code2"><b><a name="85340"></b><tt class="output">-></tt><b> *(myPtr + 4) = 5</a></b></pre></dl><dd><p class="Body"><a name="85341"> </a>Assume that the value of <b class="symbol_lc">myPtr</b> is 0x1000. In C, if <b class="symbol_lc">myPtr</b> is a pointer to a type <b class="keyword">char</b>, this would put the value 5 in the byte at address at 0x1004. If <b class="symbol_lc">myPtr</b> is a pointer to a 4-byte integer, the 4-byte value 0x00000005 would go into bytes 0x1010-0x1013. The shell, on the other hand, treats variables as integers, and therefore would put the 4-byte value 0x00000005 in bytes 0x1004-0x1007.</p></dl></dl><font face="Helvetica, sans-serif" class="sans"><h4 class="H3"><i><a name="85343">6.3.11 C Interpreter Limitations</a></i></h4></font><dl class="margin"><dl class="margin"><dd><p class="Body"><a name="85345"> </a>Powerful though it is, the C interpreter in the shell is not a complete interpreter for the C language. The following C features are <i class="emphasis">not</i> present in the Tornado shell:</p><dl class="margin"><b class="BulletHead"><li><a name="85346"> </a><font face="Helvetica, sans-serif" size="-1" class="sans">Control Structures</font></li></b></dl><dl class="margin"><dd><div class="Indent"><a name="85348"> </a>The shell interprets only C <i class="emphasis">expressions</i> (and comments). The shell does not support C control structures such as <b class="keyword">if</b>, <b class="keyword">goto</b>, and <b class="keyword">switch</b> statements, or <b class="keyword">do</b>, <b class="keyword">while</b>, and <b class="keyword">for</b> loops. Control structures are rarely needed during shell interaction. If you do come across a situation that requires a control structure, you can use the Tcl interface to the shell instead of using its C interpreter directly; see <a href="c-shell7.html#86665"><i class="title">6.7 Tcl: Shell Interpretation</i></a>.</div><br></dl><dl class="margin"><b class="BulletHead"><li><a name="85352"> </a><font face="Helvetica, sans-serif" size="-1" class="sans">Compound or Derived Types</font></li></b></dl><dl class="margin"><dd><div class="Indent"><a name="85354"> </a>No compound types (<b class="keyword">struct</b> or <b class="keyword">union</b> types) or derived types (<b class="keyword">typedef</b>) are recognized in the shell C interpreter. You can use CrossWind instead of the shell for interactive debugging, when you need to examine compound or derived types. </div><br></dl><dl class="margin"><b class="BulletHead"><li><a name="85355"> </a><font face="Helvetica, sans-serif" size="-1" class="sans">Macros</font></li></b></dl><dl class="margin"><dd><div class="Indent"><a name="85357"> </a>No C preprocessor macros (or any other preprocessor facilities) are available in the shell. CrossWind does not support preprocessor macros either, but indirect work-arounds are available using either the shell or CrossWind. For constant macros, you can define variables in the shell with similar names to the macros. To avoid intrusion into the application symbol table, you can use CrossWind instead; in this case, use CrossWind convenience variables with names corresponding to the desired macros. In either case, you can automate the effort of defining any variables you need repeatedly, by using an initialization script.</div><br></dl><dd><p class="Body"><a name="85358"> </a>For the first two problems (control structures, or display and manipulation of types that are not supported in the shell), you might also consider writing auxiliary subroutines to provide these services during development; you can call such subroutines at will from the shell, and later omit them from your final application.</p></dl></dl><font face="Helvetica, sans-serif" class="sans"><h4 class="H3"><i><a name="89400">6.3.12 C-Interpreter Primitives</a></i></h4></font><dl class="margin"><dl class="margin"><dd><p class="Body"><a name="91365"> </a><a href="c-shell3.html#96869">Table 6-13</a> lists all the primitives (commands) built into WindSh. (For discussion of these primitives by function, see <a href="c-shell2.html#99723"><i class="title">6.2.3 Invoking Built-In Shell Routines</i></a>.) Because the shell tries to find a primitive first before attempting to call a target subroutine, it is best to avoid these names in the target code. If you do have a name conflict, however, you can force the shell to call a target routine instead of an identically-named primitive by prefacing the subroutine call with the character @. (See <a href="c-shell2.html#92389"><i class="title">Resolving Name Conflicts between Host and Target</i></a>.) <p class="table"><h4 class="EntityTitle"><a name="96869"><font face="Helvetica, sans-serif" size="-1" class="sans">Table 6-13: List of WindSh Commands</font></a></h4><table border="0" cellpadding="0" cellspacing="0"><tr><td colspan="20"><hr class="tablerule"></td></tr><tr valign="top"><td colspan=1 rowspan=1><div class="CellBody"><a name="96897"> </a><b class="routine"><i class="routine">agentModeShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96898"> </a><b class="routine"><i class="routine">b</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96899"> </a><b class="routine"><i class="routine">bd</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96900"> </a><b class="routine"><i class="routine">bdall</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96901"> </a><b class="routine"><i class="routine">bh</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96902"> </a><b class="routine"><i class="routine">bootChange</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96903"> </a><b class="routine"><i class="routine">browse</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96904"> </a><b class="routine"><i class="routine">c</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96905"> </a><b class="routine"><i class="routine">cd</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96906"> </a><b class="routine"><i class="routine">checkStack</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96907"> </a><b class="routine"><i class="routine">classShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96908"> </a><b class="routine"><i class="routine">cplusCtors</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96909"> </a><b class="routine"><i class="routine">cplusDtors</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96910"> </a><b class="routine"><i class="routine">cplusStratShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96911"> </a><b class="routine"><i class="routine">cplusXtorSet</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="97143"> </a><b class="routine"><i class="routine">cret</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98546"> </a><b class="routine"><i class="routine">d</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98547"> </a><b class="routine"><i class="routine">devs</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98548"> </a><b class="routine"><i class="routine">h</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98549"> </a><b class="routine"><i class="routine">help</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98550"> </a><b class="routine"><i class="routine">hostShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="97156"> </a><b class="routine"><i class="routine">i</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98680"> </a><b class="routine"><i class="routine">icmpstatShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98681"> </a><b class="routine"><i class="routine">ifShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98682"> </a><b class="routine"><i class="routine">inetstatShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98683"> </a><b class="routine"><i class="routine">intVecShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98684"> </a><b class="routine"><i class="routine">iosDevShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98685"> </a><b class="routine"><i class="routine">iosDrvShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98678"> </a><b class="routine"><i class="routine">iosFdShow</i></b><b>( )</b></div></td><td width="10"> </td><td colspan=1 rowspan=1><div class="CellBody"><a name="96933"> </a><b class="routine"><i class="routine">ipstatShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96934"> </a><b class="routine"><i class="routine">iStrict</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96935"> </a><b class="routine"><i class="routine">l</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96936"> </a><b class="routine"><i class="routine">ld</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96937"> </a><b class="routine"><i class="routine">lkAddr</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96938"> </a><b class="routine"><i class="routine">lkup</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96939"> </a><b class="routine"><i class="routine">ls</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96940"> </a><b class="routine"><i class="routine">m</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96941"> </a><b class="routine"><i class="routine">memPartShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96942"> </a><b class="routine"><i class="routine">memShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96943"> </a><b class="routine"><i class="routine">moduleIdFigure</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96944"> </a><b class="routine"><i class="routine">moduleShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96945"> </a><b class="routine"><i class="routine">mqPxShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96946"> </a><b class="routine"><i class="routine">mRegs</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96947"> </a><b class="routine"><i class="routine">msgQShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="97164"> </a><b class="routine"><i class="routine">period</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98562"> </a><b class="routine"><i class="routine">printErrno</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98563"> </a><b class="routine"><i class="routine">printLogo</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98564"> </a><b class="routine"><i class="routine">pwd</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98565"> </a><b class="routine"><i class="routine">quit</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98566"> </a><b class="routine"><i class="routine">reboot</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="97137"> </a><b class="routine"><i class="routine">repeat</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98693"> </a><b class="routine"><i class="routine">routestatShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98694"> </a><b class="routine"><i class="routine">s</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98695"> </a><b class="routine"><i class="routine">semPxShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98696"> </a><b class="routine"><i class="routine">semShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98697"> </a><b class="routine"><i class="routine">shellHistory</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98698"> </a><b class="routine"><i class="routine">shellPromptSet</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98691"> </a><b class="routine"><i class="routine">show</i></b><b>( )</b></div></td><td width="10"> </td><td colspan=1 rowspan=1><div class="CellBody"><a name="96967"> </a><b class="routine"><i class="routine">smMemPartShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96968"> </a><b class="routine"><i class="routine">smMemShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96969"> </a><b class="routine"><i class="routine">so</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96970"> </a><b class="routine"><i class="routine">sp</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96971"> </a><b class="routine"><i class="routine">sps</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96972"> </a><b class="routine"><i class="routine">sysResume</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96973"> </a><b class="routine"><i class="routine">sysStatusShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96974"> </a><b class="routine"><i class="routine">sysSuspend</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96975"> </a><b class="routine"><i class="routine">taskCreateHookShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96976"> </a><b class="routine"><i class="routine">taskDeleteHookShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96977"> </a><b class="routine"><i class="routine">taskIdDefault</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96978"> </a><b class="routine"><i class="routine">taskIdFigure</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96979"> </a><b class="routine"><i class="routine">taskRegsShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96980"> </a><b class="routine"><i class="routine">taskShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="96981"> </a><b class="routine"><i class="routine">taskSwitchHookShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="97183"> </a><b class="routine"><i class="routine">taskWaitShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98573"> </a><b class="routine"><i class="routine">tcpstatShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98574"> </a><b class="routine"><i class="routine">td</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98575"> </a><b class="routine"><i class="routine">tftpInfoShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98576"> </a><b class="routine"><i class="routine">ti</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98577"> </a><b class="routine"><i class="routine">tr</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="97138"> </a><b class="routine"><i class="routine">ts</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98706"> </a><b class="routine"><i class="routine">tt</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98707"> </a><b class="routine"><i class="routine">tw</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98708"> </a><b class="routine"><i class="routine">udpstatShow</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98709"> </a><b class="routine"><i class="routine">unld</i></b><b>( )</b> </div><div class="CellBody"><a name="98710"> </a><b class="routine"><i class="routine">version</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98711"> </a><b class="routine"><i class="routine">w</i></b><b>( )</b><i class="i"> </i></div><div class="CellBody"><a name="98704"> </a><b class="routine"><i class="routine">wdShow</i></b><b>( )</b></div></td><td width="10"> </td></tr><tr><td colspan="20"><hr class="tablerule"></td></tr><tr valign="middle"><td colspan="20"></td></tr></table></p></p></dl></dl><font face="Helvetica, sans-serif" class="sans"><h4 class="H3"><i><a name="91360">6.3.13 Terminal-Control Characters</a></i></h4></font><dl class="margin"><dl class="margin"><dd><p class="Body"><a name="89402"> </a>The terminal-control characters are slightly different when WindSh runs as a console-based application and when it runs within Tornado.</p><dd><p class="Body"><a name="89406"> </a><a href="c-shell3.html#89417">Table 6-14</a> lists special terminal characters frequently used for shell control in both situations. For more information on the use of these characters, see <a href="c-shell5.html#100817"><i class="title">6.5 Shell Line Editing</i></a> and <a href="c-shell2.html#91150"><i class="title">6.2.7 Interrupting a Shell Command</i></a>.<b> </b><p class="table"><h4 class="EntityTitle"><a name="89417"><font face="Helvetica, sans-serif" size="-1" class="sans">Table 6-14: Shell Special Characters</font></a></h4><table border="0" cellpadding="0" cellspacing="0"><tr><td colspan="20"><hr class="tablerule"></td></tr><tr valign="middle"><th rowspan="1" colspan="1"><div class="CellHeadingC" align="center"><a name="89423"> </a><b><font face="Helvetica, sans-serif" size="-1" class="sans">Tornado Value</font></b></div></th><td width="10"> </td><th rowspan="1" colspan="1"><div class="CellHeadingC" align="center"><a name="89425"> </a><b><font face="Helvetica, sans-serif" size="-1" class="sans">Console Values</font></b></div></th><td width="10"> </td><th rowspan="1" colspan="1"><div class="CellHeading"><b><a name="89427"> </a><font face="Helvetica, sans-serif" size="-1" class="sans">Description</font></b></div></th><td width="10"> </td></tr><tr><td colspan="20"><hr class="tablerule2"></td></tr><tr valign="top"><td colspan=1 rowsp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -