1冯袍、如何查看一個(gè)進(jìn)程的內(nèi)存映射?
? ? 使用:cat? /proc/進(jìn)程的pid/maps(進(jìn)程的pid獲取見getpid函數(shù))
? ? 例:
? ? char buf[]="aaaaa";
? ? char *str="aaaaa";
? ? printf("buf%p\n",buf);//輸出字符串?dāng)?shù)組的首地址
? ? printf("str's addr=%p\n",&str);
? ? printf("str's comt=%p\n",str);
這里需要注意吸重,局部變量瑰枫,函數(shù)形參被分配到棧确沸,靜態(tài)的局部變量和全局變量在數(shù)據(jù)段中饭尝,字符串在代碼段中,使用malloc等申請(qǐng)的空間分配在堆中挨厚。buf[]中的字符串內(nèi)容和str指向的字符串內(nèi)容雖然都是“aaaaa”堡僻。但是buf[]中的內(nèi)容是程序在執(zhí)行的時(shí)候,將“aaaaa”拷貝到buf[]中的疫剃。也就是說(shuō)buf[]中存在實(shí)實(shí)在在的字符串?dāng)?shù)據(jù)钉疫。
(1)同時(shí),也可以看出初始化和賦值的區(qū)別巢价。如:
? ??? ?在上述語(yǔ)句中牲阁,將char buf[]="aaaaa";改為char buf[12]固阁;
? ? ? 增加? buf="aaaaa";
這句語(yǔ)句將代碼段的“aaaaa”首地址賦值給buf,即讓buf指向代碼段字符串咨油,而本身buf是指向棧中的字符串的您炉,buf是一個(gè)固定的常量柒爵,不能被賦值役电,而str這種指針變量可以被賦值改變指向的地址。而初始化就如同上述棉胀,將字符串拷貝到buf[]中法瑟,而不是改變buf所指地址。如要實(shí)現(xiàn)賦值拷貝唁奢,可以使用strcpy函數(shù)霎挟。
(2)另外:? ?
? ? 如有以下定義:char *p;*p='m';
? ?因?yàn)橹羔樳€未進(jìn)行初始化或者賦值,p是一個(gè)懸空指針麻掸。為非法地址酥夭。編譯可以通過,但是無(wú)法執(zhí)行脊奋。?
(3)有如下子函數(shù)
? ? ? ? void count(void){
? ? ? ? ? ? int c=1;
? ? ? ? ? ? static int c1=1;
? ? ? ? ? ? c++;
? ? ? ? ? ? c1++熬北;
? ? ? ? ? ? ?printf("c=%d,%d\n",c诚隙,c1);
? ? ? ? ? ? printf("c addr=%p\n",&c讶隐,&c1);
? ? ? ? ? ? return;
????????}
? ? 在主函數(shù)中使用for循環(huán)調(diào)用6次count函數(shù),使用cat查看maps文件內(nèi)的內(nèi)存映射久又,可以看到c被分配到棧段巫延,c1被分配到數(shù)據(jù)段。故生命周期不同地消。如下圖所示
2炉峰、獲取進(jìn)程信息
獲取進(jìn)程的ID號(hào):
? ? pid_t? getpid(void);
功能:
? ? 獲取進(jìn)程的pid
參數(shù):
? ? void?
返回值
? ? 調(diào)用進(jìn)程的pid
包含頭文件:#include<sys/types.h>、#include<unistd.h>