在c
语言中调�.shellå½ä»¤çæ¹æ³å®ç°ãcç¨åºè°ç¨shellèæ¬å
±æ两ç§æ¹æ³ï¼system()ãpopen()ï¼åå«å¦ä¸ï¼system()ä¸ç¨èªå·±å»å建è¿ç¨ï¼ç³»ç»å·²ç»å°è£
äºè¿ä¸æ¥ï¼ç´æ¥å å
¥èªå·±çå½ä»¤å³å¯popen()ä¹å¯ä»¥å®ç°æ§è¡çå½ä»¤ï¼æ¯systemå¼éå°ä»¥ä¸åå«è¯´æï¼1ï¼system(shellå½ä»¤æshellèæ¬è·¯å¾)system()ä¼è°ç¨fork()产çååç¨ï¼ç±ååç¨æ¥è°ç¨/bin/sh-cstringæ¥å±¥è¡åæ°stringå符串æ代表çå½ä»¤ï¼æ¤å½ä»¤å±¥è¡å®åéå³è¿ååè°ç¨çåç¨ãå¨è°ç¨system()æé´sigchldä¿¡å·ä¼è¢«ææ¶æç½®ï¼sigintåsigquitä¿¡å·åä¼è¢«æ¼ è§ãè¿åå¼ï¼å¦æsystem()å¨è°ç¨/bin/shæ¶å¤±è´¥åè¿å127ï¼å
¶ä»å¤±è´¥åå è¿å-1ãè¥åæ°string为空æé(null)ï¼åè¿åéé¶å¼ãå¦æsystem()è°ç¨æååæåä¼è¿åå±¥è¡shellå½ä»¤åçè¿åå¼ï¼ä½æ¯æ¤è¿åå¼ä¹æå¯è½ä¸ºsystem()è°ç¨/bin/sh失败æè¿åç127ï¼å æ¤æ好è½ååçerrnoæ¥ç¡®è®¤å±¥è¡æåãsystemå½ä»¤ä»¥å
¶ç®ç¥é«æçä½ç¨å¾å°å¾å¾å¹¿æ³çå©ç¨ï¼ä¸é¢æ¯ä¸ä¸ªä¾åä¾ï¼å¨/tmp/testdir/ç®å½ä¸æshellèæ¬tsh.shï¼å
容为#!/bin/shwget$1echo"done!"2ï¼popen(char*command,char*type)popen()ä¼è°ç¨fork()产çååç¨ï¼ç¶åä»ååç¨ä¸è°ç¨/bin/sh-cæ¥å±¥è¡åæ°commandçæ令ãåæ°typeå¯åºç¨ârâ代表读åï¼âwâ代表åå
¥ãéµå¾ªæ¤typeå¼ï¼popen()ä¼å»ºç«ç®¡éè¿å°ååç¨çæ åè¾åºè®¾å¤ææ åè¾å
¥è®¾å¤ï¼ç¶åè¿åä¸ä¸ªæ件æéãéååç¨ä¾¿å¯å©ç¨æ¤æ件æéæ¥è¯»åååç¨çè¾åºè®¾å¤ææ¯åå
¥å°ååç¨çæ åè¾å
¥è®¾å¤ä¸ãæ¤å¤ï¼ææåºç¨æ件æé(file*)æä½çå½æ°ä¹é½å¯ä»¥åºç¨ï¼é¤äºfclose()以å¤ãè¿åå¼ï¼è¥æååè¿åæ件æéï¼å¦åè¿ånullï¼å·®éåå åäºerrnoä¸ã注æï¼å¨ç¼åå
·suid/sgidæéçç¨åºæ¶è¯·å°½éé¿å
åºç¨popen()ï¼popen()ä¼ç»§æ¿ç¯å¢åéï¼éè¿ç¯å¢åéå¯è½ä¼é æç³»ç»å®å
¨çé®é¢ãä¾ï¼cç¨åºpopentest.cå
容å¦ä¸ï¼#includemain{file*fpcharbuffer[80]fp=popen(â~/myprogram/test.shâ,ârâ)fgets(buffer,sizeof(buffer),fp)printf(â%sâ,buffer)pclose(fp)}简单列举几点吧:1)shell变量没有固定类型,你可以给一个变量一会儿赋值为一个整数,一会儿赋值为一个字符串,都没关系;c
程序变量需要在定义时明确指定类型,不同类型间需要做类型转换。2)由于shell程序是逐行按次序解释执行的,函数定义必须写在函数调用的前面;而C程序不必,在文件开头加上函数申明即可。3)相同的地方也有。作为编程语言,
都有逻辑控制结构,如if语句、switch语句、while循环语句等。都有退出状态返回值。 总之,一个是脚本语言,一个是高级语言;一个是解释执行,一个是编译后执行。有天壤之别,没法比。shell
script
属于脚本语言
是按解释执行的,由解释器来执行命令
而
C
是要编译成机器码的,直接执行命令
由于解释执行的缘故,脚本语言程序一般比编译型语言的程序慢
但不是绝对的,如果编译型语言的算法写得不好,效率也会很差的