锘??xml version="1.0" encoding="utf-8" standalone="yes"?> gprof鏄疓NU profiler宸ュ叿銆傚彲浠ユ樉紺虹▼搴忚繍琛岀殑“flat profile”錛屽寘鎷瘡涓嚱鏁扮殑璋冪敤嬈℃暟錛屾瘡涓嚱鏁版秷鑰楃殑澶勭悊鍣ㄦ椂闂淬備篃鍙互鏄劇ず“璋冪敤鍥?#8221;錛屽寘鎷嚱鏁扮殑璋冪敤鍏崇郴錛屾瘡涓嚱鏁拌皟鐢ㄨ姳璐逛簡(jiǎn)澶氬皯鏃墮棿銆傝繕鍙互鏄劇ず“娉ㄩ噴鐨勬簮浠g爜”錛屾槸紼嬪簭婧愪唬鐮佺殑涓涓鏈紝鏍囪鏈夌▼搴忎腑姣忚浠g爜鐨勬墽琛屾鏁般?/p>
1錛?浣跨敤 -pg 緙栬瘧鍜岄摼鎺ヤ綘鐨勫簲鐢ㄧ▼搴忋?/p>
2錛?鎵ц浣犵殑搴旂敤紼嬪簭浣夸箣鐢熸垚渚沢prof 鍒嗘瀽鐨勬暟鎹?
3錛?浣跨敤gprof 紼嬪簭鍒嗘瀽浣犵殑搴旂敤紼嬪簭鐢熸垚鐨勬暟鎹?
$gprof -b a.out gmon.out Each sample counts as 0.01 seconds. % cumulative self self total Call graph
granularity: each sample hit covers 2 byte(s) no time propagated
index % time self children called name Index by function name
[1] function
gprof [鍙墽琛屾枃浠禲 [gmon.out鏂囦歡] [鍏跺畠鍙傛暟]
鏂規(guī)嫭鍙蜂腑鐨勫唴瀹瑰彲浠ョ渷鐣ャ傚鏋滅渷鐣ヤ簡(jiǎn)“鍙墽琛屾枃浠?#8221;錛実prof浼?xì)鍦ㄥ綋鍓嶇洰褰曚笅鎼滅储a.out鏂囦歡浣滀負(fù)鍙墽琛屾枃浠訛紝鑰屽鏋滅渷鐣ヤ簡(jiǎn)gmon.out鏂囦歡錛実prof涔熶細(xì)鍦ㄥ綋鍓嶇洰褰曚笅瀵繪壘gmon.out銆傚叾瀹冨弬鏁板彲浠ユ帶鍒秅prof杈撳嚭鍐呭鐨勬牸寮忕瓑淇℃伅銆傛渶甯哥敤鐨勫弬鏁板涓嬶細(xì)
l -b 涓嶅啀杈撳嚭緇熻鍥捐〃涓瘡涓瓧孌電殑璇︾粏鎻忚堪銆?
l -p 鍙緭鍑哄嚱鏁扮殑璋冪敤鍥撅紙Call graph鐨勯偅閮ㄥ垎淇℃伅錛夈?
l -q 鍙緭鍑哄嚱鏁扮殑鏃墮棿娑堣楀垪琛ㄣ?
l -e Name 涓嶅啀杈撳嚭鍑芥暟Name 鍙?qiáng)鍏跺瓙鍑芥暟鐨勮皟鐢ㄥ浘锛堥櫎闈炲畠浠湁鏈闄愬埗鐨勫叾瀹冪埗鍑芥晭图?jí)銆傚彲浠ョ粰瀹氬涓?-e 鏍囧織銆備竴涓?-e 鏍囧織鍙兘鎸囧畾涓涓嚱鏁般?
l -E Name 涓嶅啀杈撳嚭鍑芥暟Name 鍙?qiáng)鍏跺瓙鍑芥暟鐨勮皟鐢ㄥ浘锛屾鏍囧織绫讳奸g簬 -e 鏍囧織錛屼絾瀹冨湪鎬繪椂闂村拰鐧懼垎姣旀椂闂寸殑璁$畻涓帓闄や簡(jiǎn)鐢卞嚱鏁癗ame 鍙?qiáng)鍏跺瓙鍑芥暟鎵鐢ㄧ殑鏃墮棿銆?
l -f Name 杈撳嚭鍑芥暟Name 鍙?qiáng)鍏跺瓙鍑芥暟鐨勮皟鐢ㄥ浘銆傚彲浠ユ寚瀹氬涓?-f 鏍囧織銆備竴涓?-f 鏍囧織鍙兘鎸囧畾涓涓嚱鏁般?
l -F Name 杈撳嚭鍑芥暟Name 鍙?qiáng)鍏跺瓙鍑芥暟鐨勮皟鐢ㄥ浘锛屽畠绫讳奸g簬 -f 鏍囧織錛屼絾瀹冨湪鎬繪椂闂村拰鐧懼垎姣旀椂闂磋綆椾腑浠呬嬌鐢ㄦ墍鎵撳嵃鐨勪緥紼嬬殑鏃墮棿銆傚彲浠ユ寚瀹氬涓?-F 鏍囧織銆備竴涓?-F 鏍囧織鍙兘鎸囧畾涓涓嚱鏁般?F 鏍囧織瑕嗙洊 -E 鏍囧織銆?
l -z 鏄劇ず浣跨敤嬈℃暟涓洪浂鐨勪緥紼嬶紙鎸夌収璋冪敤璁℃暟鍜岀瘡縐椂闂磋綆楋級(jí)銆?
涓嶈繃,gprof涓嶈兘鏄劇ず瀵硅薄涔嬮棿鐨勭戶鎵垮叧緋?榪欎篃鏄畠鐨勫急鐐? 鎹殑楂樹(shù)綅淇濆瓨鍦ㄥ唴瀛樼殑楂樺湴鍧涓紝榪欑瀛樺偍妯″紡灝嗗湴鍧鐨勯珮?shù)綆鍜屾暟鎹綅鏉冩湁鏁堝湴缁撳悎钃v鏉ワ紝楂樺湴鍧閮ㄥ垎鏉冨奸珮錛屼綆鍦板潃閮ㄥ垎鏉冨間綆錛屽拰鎴戜滑鐨勯昏緫鏂規(guī)硶涓鑷淬?/span> 8bitC8bitchar16bitshort32bitlong 8163216bitshortx0x0010x0x11220x110x22澶х妯″紡錛屽氨灝?/span>0x110x00100x220x0011X86KEIL C51ARMDSPARM浜屻佷婦渚嬭鏄?/span>
AASCII650x4100 00 00 41 -----41 00 00 00 -----涓夈佷嬌鐢ㄤ唬鐮佸垽鏂ぇ灝忕妯″紡
union/** * 寰楀埌褰撳墠緋葷粺鐨勫ぇ灝忕灞炴?/span>, 32 */ static union { char c[4]; unsigned long l; } endian_test = { { 'l', '?', '?', 'b' } }; #define ENDIANNESS ((char)endian_test.l) /** * : */ static union { short n; char c[sizeof(short)]; }un; int getEndian() { un.n = 0x0102; if ((un.c[0] == 1 && un.c[1] == 2)) { printf("big endian/n"); } else if ((un.c[0] == 2 && un.c[1] == 1)) { printf("little endian/n"); } else printf("error!/n"); return 0; } /** * : */ int getEndian() { int c = 1; // big-endian: 00 00 00 01 little-endian: 01 00 00 00 // int c = 0x02000001; // big-endian: 02 00 00 01 little-endian: 01 00 00 02 if ((*(char *)&c) == 1) // c { printf("little endian/n"); } else printf("big endian"); return 0; } 鍒涘緩FIFO綆¢亾 FIFO璇誨啓鎿嶄綔gprof浠嬬粛
涓篻prof緙栬瘧紼嬪簭
鍦ㄧ紪璇戞垨閾炬帴婧愮▼搴忕殑鏃跺欏湪緙栬瘧鍣ㄧ殑鍛戒護(hù)琛屽弬鏁頒腑鍔犲叆“-pg”閫夐」錛岀紪璇戞椂緙栬瘧鍣ㄤ細(xì)鑷姩鍦ㄧ洰鏍囦唬鐮佷腑鎻掑叆鐢ㄤ簬鎬ц兘嫻嬭瘯鐨勪唬鐮佺墖鏂紝榪欎簺浠g爜鍦ㄧ▼搴忓湪榪愯鏃墮噰闆嗗茍璁板綍鍑芥暟鐨勮皟鐢ㄥ叧緋誨拰璋冪敤嬈℃暟錛屼互鍙?qiáng)閲囬泦迤堣褰曞嚱鏁拌嚜桧n鎵ц鏃墮棿鍜屽瓙鍑芥暟鐨勮皟鐢ㄦ椂闂達(dá)紝紼嬪簭榪愯緇撴潫鍚庯紝浼?xì)鍦ńE嬪簭閫鍑虹殑璺緞涓嬬敓鎴愪竴涓猤mon.out鏂囦歡銆傝繖涓枃浠跺氨鏄褰曞茍淇濆瓨?shù)笅鏉ョ殑鐩戞帶鏁版嵁銆傚彲浠ラ氳繃鍛戒護(hù)琛屾柟寮忕殑gprof鎴栧浘褰㈠寲鐨凨prof鏉ヨВ璇昏繖浜涙暟鎹茍瀵圭▼搴忕殑鎬ц兘榪涜鍒嗘瀽銆傚彟澶栵紝濡傛灉鎯蟲(chóng)煡鐪嬪簱鍑芥暟鐨刾rofiling錛岄渶瑕佸湪緙栬瘧鏄啀鍔犲叆“-lc_p”緙栬瘧鍙傛暟浠f浛“-lc”緙栬瘧鍙傛暟錛岃繖鏍風(fēng)▼搴忎細(xì)閾炬帴libc_p.a搴擄紝鎵嶅彲浠ヤ駭鐢熷簱鍑芥暟鐨刾rofiling淇℃伅銆傚鏋滄兂鎵ц涓琛屼竴琛岀殑profiling錛岃繕闇瑕佸姞鍏?#8220;-g”緙栬瘧鍙傛暟銆?br />渚嬪濡備笅鍛戒護(hù)琛岋細(xì)gcc -Wall -g -pg -lc_p example.c -o exampleGprof鍩烘湰鐢ㄦ硶錛?/em>
Flat profile:
no time accumulated
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 1 0.00 0.00 function
0.00 0.00 1/1 main [8]
[1] 0.0 0.00 0.00 1 function [1]
-----------------------------------------------
gprof浜х敓鐨勪俊鎭?/h1>
% the percentage of the total running time of the
time program used by this function.
鍑芥暟浣跨敤鏃墮棿鍗犳墍鏈夋椂闂寸殑鐧懼垎姣斻?br />cumulative a running sum of the number of seconds accounted
seconds for by this function and those listed above it.
鍑芥暟鍜屼笂鍒楀嚱鏁扮瘡璁℃墽琛岀殑鏃墮棿銆?br />self the number of seconds accounted for by this
seconds function alone. This is the major sort for this
listing.
鍑芥暟鏈韓鎵鎵ц鐨勬椂闂淬?br />calls the number of times this function was invoked, if
this function is profiled, else blank.
鍑芥暟琚皟鐢ㄧ殑嬈℃暟
self the average number of milliseconds spent in this
ms/call function per call, if this function is profiled,
else blank.
姣忎竴嬈¤皟鐢ㄨ姳璐瑰湪鍑芥暟鐨勬椂闂磎icroseconds銆?br />total the average number of milliseconds spent in this
ms/call function and its descendents per call, if this
function is profiled, else blank.
姣忎竴嬈¤皟鐢紝鑺辮垂鍦ㄥ嚱鏁板強(qiáng)鍏惰鐢熷嚱鏁扮殑騫沖潎鏃墮棿microseconds銆?br />name the name of the function. This is the minor sort
for this listing. The index shows the location of
the function in the gprof listing. If the index is
in parenthesis it shows where it would appear in
the gprof listing if it were to be printed.
鍑芥暟鍚?/p>
鍛戒護(hù)鏍煎紡
]]>
]]>
$mkfifo –m 600 fifocat
#include <sys/stat.h>
#include <sys/types.h>
int mkfifo( const char *filename, mode_t mode );
鍙傛暟璇存槑錛歮ode鎸囧畾FIFO鐨勮鍐欐潈闄愶紝鏂板垱寤篎IFO鐨勭敤鎴稩D鍜岀粍ID瑙勫垯銆備笌open鍑芥暟鐩稿悓銆?br> 鍙傛暟mode 鍒欐湁涓嬪垪鏁扮緇勫悎錛屽彧鏈夊湪寤虹珛鏂版枃浠舵椂鎵嶄細(xì)鐢熸晥錛屾澶栫湡姝e緩鏂囦歡鏃剁殑鏉冮檺浼?xì)鍙楀埌umask鍊兼墍褰卞搷錛屽洜姝よ鏂囦歡鏉冮檺搴旇涓猴紙mode-umaks錛夈?br>S_IRWXU00700 鏉冮檺錛屼唬琛ㄨ鏂囦歡鎵鏈夎呭叿鏈夊彲璇匯佸彲鍐欏強(qiáng)鍙墽琛岀殑鏉冮檺銆?br>S_IRUSR 鎴朣_IREAD錛?0400鏉冮檺錛屼唬琛ㄨ鏂囦歡鎵鏈夎呭叿鏈夊彲璇誨彇鐨勬潈闄愩?br>S_IWUSR 鎴朣_IWRITE錛?0200 鏉冮檺錛屼唬琛ㄨ鏂囦歡鎵鏈夎呭叿鏈夊彲鍐欏叆鐨勬潈闄愩?br>S_IXUSR 鎴朣_IEXEC錛?0100 鏉冮檺錛屼唬琛ㄨ鏂囦歡鎵鏈夎呭叿鏈夊彲鎵ц鐨勬潈闄愩?br>S_IRWXG 00070鏉冮檺錛屼唬琛ㄨ鏂囦歡鐢ㄦ埛緇勫叿鏈夊彲璇匯佸彲鍐欏強(qiáng)鍙墽琛岀殑鏉冮檺銆?br>S_IRGRP 00040 鏉冮檺錛屼唬琛ㄨ鏂囦歡鐢ㄦ埛緇勫叿鏈夊彲璇葷殑鏉冮檺銆?br>S_IWGRP 00020鏉冮檺錛屼唬琛ㄨ鏂囦歡鐢ㄦ埛緇勫叿鏈夊彲鍐欏叆鐨勬潈闄愩?br>S_IXGRP 00010 鏉冮檺錛屼唬琛ㄨ鏂囦歡鐢ㄦ埛緇勫叿鏈夊彲鎵ц鐨勬潈闄愩?br>S_IRWXO 00007鏉冮檺錛屼唬琛ㄥ叾浠栫敤鎴峰叿鏈夊彲璇匯佸彲鍐欏強(qiáng)鍙墽琛岀殑鏉冮檺銆?br>S_IROTH 00004 鏉冮檺錛屼唬琛ㄥ叾浠栫敤鎴峰叿鏈夊彲璇葷殑鏉冮檺
S_IWOTH 00002鏉冮檺錛屼唬琛ㄥ叾浠栫敤鎴峰叿鏈夊彲鍐欏叆鐨勬潈闄愩?br>S_IXOTH 00001 鏉冮檺錛屼唬琛ㄥ叾浠栫敤鎴峰叿鏈夊彲鎵ц鐨勬潈闄愩?br> %娉ㄦ剰錛氬綋瑕佸垱寤轟竴涓凡緇忓瓨鍦ㄧ殑FIFO鏃訛紝紼嬪簭浼?xì)漶旂敓涓涓狤EXIST鐨勫紓甯?/p>
鑸殑I/O錛坥pen close read write unlink錛夊嚱鏁伴兘鍙互鐢ㄤ簬FIFO鏂囦歡錛岄渶瑕佹敞鎰忕殑鏄紝鍦ㄤ嬌鐢╫pen鍑芥暟鎵撳紑涓涓狥IFO鏂囦歡鏃訛紝open鍑芥暟鍙傛暟flag鏍囧織浣嶇殑O_NONBLOCK鏍囧織錛屽畠鍏崇郴鍒板嚱鏁扮殑榪斿洖鐘舵併傝緇嗚鏄庡琛?4-2鎵紺恒?br>琛?4-2 open鍑芥暟鐨刦lag(O_NONBLOCK)璇︾粏璇存槑
O_NONBLOCK鏍囧織
璇?緇?璇?鏄?br>緗綅
鍙open绔嬪嵆榪斿洖銆傚綋鍙啓open鏃訛紝濡傛灉娌℃湁榪涚▼涓鴻鎵撳紑FIFO錛屽垯榪斿洖–1錛屽茍緗甧rrno鍊間負(fù)ENXIO
涓嶇疆浣?br>open瑙嗘儏鍐甸樆濉炪傚彧璇籵pen瑕侀樆濉炲埌鏈夎繘紼嬩負(fù)鍐欐墦寮FIFO錛屽彧鍐檕pen瑕侀樆濉炲埌鏈夎繘紼嬩負(fù)璇繪墦寮FIFO
FIFO鐨勫啓鎿嶄綔瑙勫垯綾諱技浜庡尶鍚嶇閬撶殑鍐欐搷浣滆鍒欙紝褰撴病鏈夎繘紼嬩負(fù)璇繪墦寮FIFO錛岃皟鐢╳rite鍑芥暟鏉ヨ繘琛屽啓鎿嶄綔浼?xì)漶旂敓淇″彿SIGPIPE錛屽垯淇″彿鍙互琚崟鎹夋垨鑰呭畬鍏ㄥ拷鐣ャ?br> %娉ㄦ剰錛氬綋FIFO鐨勬墍鏈夊啓榪涚▼閮藉凡緇忓叧闂紝鍒欎負(fù)FIFO鐨勮榪涚▼浜х敓涓涓枃浠剁粨鏉熺銆?/p>
FIFO鐨勭己鐐?br> 褰撶劧FIFO涔熸湁瀹冪殑灞闄愭э紝濡傚浘14-6鎵紺恒傚鎴風(fēng)鍙互鍙戣姹傚埌鏈嶅姟鍣紝浣嗗墠鎻愭槸瑕佺煡閬撲竴涓叕鍏辯殑FIFO閫氶亾錛屽浜庡疄鐜版湇鍔″櫒鍥炰紶搴旂瓟鍒板鎴風(fēng)鐨勯棶棰橈紝鍙互閫氳繃涓烘瘡涓涓鎴風(fēng)鍒涘緩涓涓笓鐢ㄧ殑FIFO錛屾潵瀹炵幇鍥炰紶搴旂瓟銆備絾涔熸湁涓嶈凍錛屾湇鍔″櫒浼?xì)鍚屾椂搴斀{旀垚鍗冧笂涓囦釜瀹㈡埛绔紝鍒涘緩濡傛澶氱殑FIFO鏄惁浼?xì)鋴删p葷粺璐熻澆榪囧ぇ錛岀浉搴旂殑濡備綍鍒ゆ柇瀹㈡埛绔槸鍚﹀洜鎰忓鑰屽穿婧冩垚涓洪毦棰橈紝鎴栬呭鎴風(fēng)涓嶈鍙栧簲絳旂洿鎺ラ鍑猴紝鎵浠ユ湇鍔″櫒蹇呴』澶勭悊SIGPIPE淇″彿錛屽茍鍋氱浉搴斿鐞嗐?br>
]]>
欏懼悕鎬濅箟錛屽尶鍚嶅崐鍙屽伐綆¢亾娌℃湁鍚嶅瓧錛岃繖涓壒鎬у鑷翠簡(jiǎn)瀹冨湪搴旂敤鏂歸潰鐨勫眬闄愭э細(xì)
1.鍙兘鍦ㄦ湁鍏鋒湁鍏叡紲栧厛鐨勮繘紼嬮棿閫氫俊錛屽嵆鎴栨槸鐖跺瓙鍏崇郴榪涚▼闂淬佹垨鏄湪鍏勫紵鍏崇郴榪涚▼闂撮氫俊銆?br> 2.鏁版嵁鍙兘鍦ㄤ竴涓柟鍚戜笂縐誨姩
綆¢亾鍒涘緩
灝界榪欐牱錛屽崐鍙屽伐綆¢亾榪樻槸Linux緋葷粺涓婃渶甯歌鐨勯氫俊鏂瑰紡銆侺inux緋葷粺鐢╬ipe鍑芥暟鍒涘緩涓涓崐鍙屽伐綆¢亾錛屾湡鍑芥暟鍘熷瀷涓猴細(xì)
include<unistd.h>
int pipe(int fd[2]);
鍙傛暟fd鏄竴涓暱搴︿負(fù)2鐨勬枃浠舵弿榪扮錛宖d[1]涓鴻緭鍏ユ枃浠舵弿榪扮錛宖d[1]涓鴻緭鍑烘枃浠舵弿榪扮錛涘嚱鏁拌繑鍥炵被鍨嬩負(fù)int錛?琛ㄧず鎴愬姛錛?1琛ㄧず澶辮觸銆傚綋鎴愬姛榪斿洖鏃訛紝鍒欒嚜鍔ㄧ淮鎶や竴涓粠fd[1]鍒癴d[0]鐨勫悓琛岀閬撱?br>綆¢亾鎿嶄綔
瀵圭閬撹繘琛岃鍐欙紝鍙互閫氳繃write鍜宺ead榪涜錛?br> write(fd[1], "create the pipe successfully !\n", 31 ); /*鍚戠閬撳啓鍏ョ鍐欏叆鏁版嵁*/
char str[256];
read(fd[0], str, sizeof(str) ); /*浠庣閬撹鍑虹璇誨嚭鏁版嵁*/
璇誨啓鏃訛紝闇瑕佹敞鎰忕殑闂錛?br> 1.褰撹緭鍑虹鍏抽棴鏃訛紝瀵硅緭鍏ョ鐨勫啓鎿嶄綔浼?xì)漶旂敓淇″彿SIGPIPE錛岃鏄庣閬撹绔凡緇忓叧闂紝騫朵笖write鎿嶄綔榪斿洖涓?#8211;1錛宔rrno鐨勫間負(fù)EPIPE錛屽浜嶴IGPIPE淇″彿鍙互榪涜鎹曟崏澶勭悊銆?br> 2.read榪斿洖0璇存槑綆¢亾涓病鏁版嵁錛屼絾涓嶈兘璇存槑杈撳叆绔槸鍚﹀叧闂?br>鎿嶄綔嫻佺▼
1.鍒涘緩綆¢亾
2.鍒╃敤fork鍒涘緩瀛愯繘紼?br> 3.鎺у埗綆¢亾嫻佸悜
4.浠巉d[1]鍚戠閬撳啓淇℃伅
5.閫氳繃fd[0]浠庣閬撴浮淇℃伅
鍒涘緩綆¢亾鐨勬爣鍑嗗簱鍑芥暟
#include <stdio.h>
FILE *popen( const char * command, const char *mode );
int pclose ( FILE *stream );
紺轟緥
寮曠敤銆奓inux C紼嬪簭璁捐澶у叏銆?涓殑渚嬪瓙
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#define BUFES PIPE_BUF /* PIPE_BUF綆¢亾榛樿涓嬈℃ц鍐欑殑鏁版嵁闀垮害*/
int main ( void ) {
int fd[2];
char buf[BUFSZ];
pid_t pid;
int len;
if ( (pipe(fd)) < 0 ){ /*鍒涘緩綆¢亾*/
perror ( "failed to pipe" );
exit( 1 );
}
if ( (pid = fork()) < 0 ){ /* 鍒涘緩涓涓瓙榪涚▼ */
perror ( "failed to fork " );
exit( 1 );
}
else if ( pid > 0 ){
close ( fd[0] ); /*鐖惰繘紼嬩腑鍏抽棴綆¢亾鐨勮鍑虹*/
write (fd[1], "hello my son!\n", 14 ); /*鐖惰繘紼嬪悜綆¢亾鍐欏叆鏁版嵁*/
exit ( 0);
}
else {
close ( fd[1] ); /*瀛愯繘紼嬪叧闂閬撶殑鍐欏叆绔?/
len = read (fd[0], buf, BUFS ); /*瀛愯繘紼嬩粠綆¢亾涓鍑烘暟鎹?/
if ( len < 0 ){
perror ( "process failed when read a pipe " );
exit( 1 );
}
else
write(STDOUT_FILENO, buf, len); /*杈撳嚭鍒版爣鍑嗚緭鍑?/
exit(0);
}
}