新聞中心
Linux用戶指針訪問技巧大揭秘

創(chuàng)新互聯(lián)建站為客戶提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開發(fā). 服務(wù)項目涵蓋了網(wǎng)頁設(shè)計、網(wǎng)站程序開發(fā)、WEB系統(tǒng)開發(fā)、微信二次開發(fā)、移動網(wǎng)站建設(shè)等網(wǎng)站方面業(yè)務(wù)。
指針是C語言中最重要的概念之一,它被廣泛地用于內(nèi)存管理以及數(shù)據(jù)結(jié)構(gòu)操作中。然而,在Linux系統(tǒng)中,指針的使用也非常普遍。本文將會介紹一些Linux用戶指針訪問的技巧,在日常的系統(tǒng)操作中非常實用。
1. 熟悉Linux系統(tǒng)中的指針類型
Linux系統(tǒng)中有很多不同類型的指針,每種指針都有自己的特點和應(yīng)用場景。C語言中經(jīng)常使用的指針類型有以下幾種:
– char型指針:用于訪問字符型數(shù)組;
– int型指針:用于訪問整型數(shù)組;
– double型指針:用于訪問雙精度浮點型數(shù)組;
– void型指針:用于訪問任意類型的數(shù)據(jù)。
在Linux系統(tǒng)中,還有其他類型的指針,例如文件指針和結(jié)構(gòu)體指針等。熟悉每種指針類型的特點和用途,可以幫助用戶更好地操作系統(tǒng)。
2. 使用指針訪問系統(tǒng)文件
在Linux系統(tǒng)中,文件被看作是一種特殊類型的數(shù)據(jù)。用戶可以使用指針訪問系統(tǒng)中的文件,實現(xiàn)對文件的讀/寫操作。
例如,要訪問一個名為“test.txt”的文件,可以使用以下代碼:
“`
#include
int mn() {
FILE *fp;
char c;
fp = fopen(“test.txt”, “r”);
while ((c = getc(fp)) != EOF)
putchar(c);
fclose(fp);
return 0;
}
“`
在上面的代碼中,使用FILE類型的指針fp打開文件,然后使用getc()函數(shù)逐個讀取文件中的字符,并輸出到屏幕上。
3. 使用指針訪問系統(tǒng)變量
除了文件,Linux系統(tǒng)中還有很多變量需要進行操作。使用指針可以方便地訪問系統(tǒng)中的變量,比如內(nèi)存地址。
以下是一個訪問系統(tǒng)變量的例子:
“`
#include
int mn() {
int a = 10;
int *ptr;
ptr = &a;
printf(“變量a的地址為:%p\n”, ptr);
printf(“變量a的值為:%d\n”, *ptr);
return 0;
}
“`
在上面的代碼中,使用“&”符號獲取變量a的地址,然后使用int類型的指針ptr保存變量a的地址。使用“*”符號可以獲取該地址對應(yīng)的變量的值。通過上面代碼的輸出結(jié)果,可以看到變量a的地址和值。
4. 使用指針創(chuàng)建鏈表
鏈表是一種常用的數(shù)據(jù)結(jié)構(gòu),也是指針的典型用途之一。在Linux系統(tǒng)中,使用指針可以方便地創(chuàng)建鏈表并進行各種操作。
下面是一個簡單的鏈表示例:
“`
#include
#include
struct node{
int data;
struct node *next;
};
struct node *head;
void insert(int x){
struct node *newnode = (struct node*) malloc(sizeof(struct node));
newnode -> data = x;
newnode -> next = head;
head = newnode;
}
void print(){
struct node *temp = head;
printf(“鏈表中的元素:\n”);
while(temp != NULL){
printf(“%d “,temp -> data);
temp = temp -> next;
}
printf(“\n”);
}
int mn(){
head = NULL;
insert(2);
insert(4);
insert(6);
insert(8);
insert(10);
print();
return 0;
}
“`
在上面的代碼中,定義了一個名為“node”的結(jié)構(gòu)體,其中包含一個int類型的“data”成員變量和一個指向“node”類型的“next”指針。在插入數(shù)據(jù)時,使用“newnode -> next = head”語句將新插入的結(jié)點指向鏈表頭部。在打印鏈表中的元素時,使用“while”循環(huán)遍歷鏈表,并輸出每個結(jié)點的數(shù)據(jù)。
5. 使用指針實現(xiàn)多進程共享內(nèi)存
在Linux系統(tǒng)中,多進程共享內(nèi)存是一種非常常見的操作。使用指針可以方便地實現(xiàn)多進程之間的內(nèi)存共享。
以下是一個簡單的多進程共享內(nèi)存示例:
“`
#include
#include
#include
#include
#include
int mn(int argc, char *argv[]){
int shmid;
char *data;
char buf[1024];
// 獲取共享內(nèi)存
shmid = shmget((key_t)1234, 1024, 0666|IPC_CREAT);
if(shmid == -1){
perror(“shmget fled”);
return 1;
}
// 映射共享內(nèi)存到進程地址空間
data = shmat(shmid, (void*)0, 0);
if(data == (void*)-1){
perror(“shmat fled”);
return 1;
}
// 寫入數(shù)據(jù)到共享內(nèi)存
memset(data, 0x00, 1024);
strncpy(data, argv[1], strlen(argv[1]));
// 讀取共享內(nèi)存中的數(shù)據(jù)
strncpy(buf, data, 1024);
printf(“讀取到的數(shù)據(jù):%s\n”, buf);
// 解除映射共享內(nèi)存
if(shmdt(data) == -1){
perror(“shmdt fled”);
return 1;
}
// 刪除共享內(nèi)存
if(shmctl(shmid, IPC_RMID, 0) == -1){
perror(“shmctl(IPC_RMID) fled”);
return 1;
}
return 0;
}
“`
在上面的代碼中,使用shmget()函數(shù)創(chuàng)建共享內(nèi)存,使用shmat()函數(shù)將共享內(nèi)存映射到進程的地址空間中。使用strncpy()函數(shù)將數(shù)據(jù)寫入到共享內(nèi)存。使用shmdt()函數(shù)解除共享內(nèi)存和進程的連接,使用shmctl()函數(shù)刪除該共享內(nèi)存。使用指針操作共享內(nèi)存,可以方便地在多個進程之間傳遞數(shù)據(jù)。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù)!
linux下怎么用文件指針呀?
因為你打開了警告選項 -Wall 所以有寬仿的不是巖困錯誤的提示信息也會打出來
linux 下gcc 對編譯要求比vc下要嚴格
去掉-Wall 或者 函數(shù)末慎棗纖尾返回 int類型的值就可以
goodluck
你的main最后少了 return 0;
“stdio.h” 要寫成
關(guān)于linux中空指針的問題
把char *p=(char *)0;換成char *p=(char *)malloc(0);或者睜搭char *p=(const char *)malloc(0);
const char* 是常量,指針指向的內(nèi)容不可變,但指李缺針本身可以再悉擾拿賦值
char* 是變量,賦值后允許改變。
這個問題,實際上在今天的JulianTec adil 郵件列表中有人問到了。 yihe chen 給出了答案:
這個問題得啟手從指針說起。
C語言里面的指針可以指向任何有效的數(shù)據(jù),也可以
不指向任何東西;這后者即所謂的NULL指針。
指向有效數(shù)據(jù)的時候,對它使用*做dereference操作
就可以取出數(shù)據(jù)來了;但是對不悄棗嫌指向任何數(shù)據(jù)的指針
來進行*操作肯定就沒什么意義了,對吧?這其實是個
bug。
在現(xiàn)代的操作系統(tǒng)設(shè)計中,為了消除程序里面的這種
bug,故意分配一個專門的不能訪問的內(nèi)存頁,然后
將NULL指針安排在里面。這樣當程序員不小心在自己
的程序中寫下對NULL指針的提領(lǐng)操作后,系統(tǒng)運行時
就會報錯。
在windows和linux中,這樣的內(nèi)存頁被設(shè)計者安排在
0地址開始對應(yīng)的那個頁上。實際上,這個頁面里面
的任何地址都是不能被提領(lǐng)的。*((char *)0) 不巖純可以,
*((char *)0x12)之類的地址也不可以。
很多人認為NULL指針其實就是指向0地址的指針,實際
上這是不準確的。雖然很少見,但也有處理器架構(gòu)將
NULL指針安排在非零地址起始的頁面內(nèi)。所以為了程
序的可移植性,在需要使用NULL指針的時候,用null
而來不用0值來初始化指針變量。
你可以訪問這里的歸檔:
但是今天的,沒這么快歸進去,你可以訪問這里的記錄:
,1
這個問題沒有什么不理解的,系統(tǒng)規(guī)定了低端地址是不允許訪問的,屬于系統(tǒng)專用。
這些都是類型不一致的警告,系統(tǒng)依然會生成可執(zhí)行文件,在這個程序中可以忽略這些警告信息,可以用帶-w參數(shù)的gcc編譯這個文件,就不會輸出這些警告信息了。
*************************************************
你用的GCC版本是多少?在4.2.4中不會輸出警告。
*************************************************
如果打算在LINUX系統(tǒng)中學(xué)習C語言,或者打算真正掌握C語言的精華,而不是為了應(yīng)付考試,就不要用這本書,這本書不是為真正學(xué)習C語言的人準備的,而是給為過考試的人設(shè)計的,里面的內(nèi)容太粗糙了!而且這本書的調(diào)試環(huán)境是脊沒旅TC2或者VC++6.0,二者對ANSI C的支持都很差,而GCC則是對ANSI C支持最強的,所以一些在TC2或者VC++6.0中看起來正櫻凳常的不標準的C程序在GCC的眼中當然會錯誤百出。察散
Linux一切皆文件
Linux中所有內(nèi)容都是以文粗枝件的形式保存和管理的,即一切皆文件,普通文件是文件,目錄是文件,硬件設(shè)備是文件,套接字、網(wǎng)絡(luò)通信等資源也都是文件。
Linux系統(tǒng)中,文件具體可以空凳握分為以下幾種類型:
1、普通文件
類似mp4、pdf、html這樣,可直接拿來使用的文件都屬于普通文件,Linux用戶根據(jù)訪問權(quán)限的不同可以對這些文件進行查看、刪除以及更改操作。
2、目錄文件
Linux系統(tǒng)中,目錄文件包含了此目錄中各個文件的文件名以及指向這些文件的指針,打開目錄等同于打開目錄文件,只要你有權(quán)限,可以隨意訪問目錄中的任何文件。
注意,目錄文件的訪問權(quán)限,同普通文件的執(zhí)行權(quán)限,是一個意思。
3、字符設(shè)備文件和塊設(shè)備文件
這些文件隱藏在/dev/目錄下,當進行設(shè)備讀取或外設(shè)交互時才會被使用。
例如,磁盤光驅(qū)屬于塊設(shè)備文件,串口設(shè)備則屬于字符設(shè)備文件。
Linux系統(tǒng)中的所有設(shè)備,要么是塊設(shè)備文件,要么是字符設(shè)備文件。
4、套接字文件
套接字文件一般隱藏在/var/run/目錄下,用于進程間的網(wǎng)絡(luò)通信。
5、符號鏈接文件
類似于Windows中的快捷方式,是指向另一文件的簡介指針。
6、管道文件
主要斗慶用于進程間通信。例如,使用mkfifo命令創(chuàng)建一個FIFO文件,與此同時,啟用進程A從FIFO文件讀數(shù)據(jù),啟用進程B從FIFO文件中寫數(shù)據(jù),隨寫隨讀。
Linux 中所配慧有內(nèi)容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目錄(Windows稱為文件夾)是文件,硬件設(shè)備(鍵盤、監(jiān)視器、硬盤、打印機)是文件,就連套接字(socket)、網(wǎng)絡(luò)通訊等資源也都是文件。
Linux系統(tǒng)中的文件類型
類似于 mp4、pdf、HTML、這樣可以直接拿來使用的文件屬于普通文件,Linux用戶根據(jù)訪問權(quán)限的不同可以對這些文件進行查看、刪除以及更改操作。
對于用慣Windows系統(tǒng)的用戶來說,目錄是文件可能不太好理解
Linux系統(tǒng)中,目錄文件包含了此目錄中各個文件的文件名以及指向這些文件的指針,打開目錄等同于目錄文件,只要你有權(quán)限,可以隨意訪問目錄中的任何文件。
注意:目錄文件的訪問權(quán)限,同普通文件的執(zhí)行權(quán)限是一個意思。
這些文件隱藏在/dev/目錄下,當進行設(shè)備讀取或外設(shè)交互時才會被使用。
例如,磁盤光驅(qū)屬于塊設(shè)備文件,串口設(shè)備則缺告屬于字符設(shè)備文件
Linux系統(tǒng)中的所有設(shè)備,要么是塊設(shè)備文件,要么是字符設(shè)備文件
套接字文件一般隱藏在/var/run/目錄下,用于進程間的網(wǎng)絡(luò)通信。
類似于Windows中的快捷方式,是指向另一文件的簡介指針(也就是軟鏈接)。
主要用于進程間的通訊。例如,使用mkfifo命令創(chuàng)建一個FIFO文件,與此同時,啟用進程A從FIFO文件讀取數(shù)伏賣明據(jù),啟用B從FIFO文件中寫數(shù)據(jù),隨寫隨讀。
一切皆是文件的利弊
和Windows不同的是,Linux沒有C盤、D盤E盤那么多的盤符,只有一個根目錄(/),所有文件資源所有的文件資源都存儲在以根目錄(/)為樹根的樹形目錄結(jié)構(gòu)中。
這樣最明顯的好處就是開發(fā)者僅需要使用一套API和開發(fā)工具即可調(diào)取Linux系統(tǒng)中絕大部分資源。舉個簡單的例子,Linux中幾乎所有讀(讀文件、讀系統(tǒng)狀態(tài)、讀socket,讀PIPE)的操作都可以用read函數(shù)來進行;幾乎所有更改,(更改文件、更改系統(tǒng)參數(shù),寫socket,寫PIPE)的操作都可以用write函數(shù)來進行。
不利之處在于,使用任何硬件設(shè)備都必須與根目錄下某一目錄執(zhí)行掛載操作,否則無法使用。我們知道,本身Linux具有一個以根目錄為樹根的文件目錄結(jié)構(gòu),每個設(shè)備也同樣如此,他們是相互獨立的。如果我們想通過Linux上的根目錄找到設(shè)備文件的目錄結(jié)構(gòu),就必須將這兩個文件系統(tǒng)目錄合二為一,這就是掛載的真正含義。
關(guān)于linux訪問用戶指針的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機/香港空間。香港虛擬主機特點是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機精選cn2+bgp線路訪問快、穩(wěn)定!
當前名稱:Linux用戶指針訪問技巧大揭秘(linux訪問用戶指針)
轉(zhuǎn)載注明:http://m.fisionsoft.com.cn/article/dhgsooc.html


咨詢
建站咨詢
