1. 程式人生 > >symlink和readlink函式-符號連結

symlink和readlink函式-符號連結

一、symlink函式

symlink函式用於建立一個符號連結檔案。函式原型:

  1. #include <unistd.h>
  2. int symlink(constchar *actualpath, constchar *sympath);  

返回值:如果建立成功則返回0,否則返回-1

引數:

actualpath 要指向的路徑

sympath 被建立的新目錄項路徑

symlink的本質是相當於creat一個檔案sympath,並把actualpath的值(字串)寫進檔案sympath,同時把檔案標識為符號連線型別。

可見,symlink和link函式雖然都產生一個叫作連結的東西,但二者完全是兩碼事。(參閱《4.15 link、unlink函式與檔案目錄項》)

例項 x.4.17.1.c

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main(void)  
  4. {  
  5.     char     actualpath[] = "/tmp/myfile";  
  6.     char     sympath[] = "/tmp/mysymlink";  
  7.     if (symlink(actualpath, sympath) == -1)  
  8.         printf("symlink error for %s\n", sympath);   
  9.     else
  10.         printf("symlink succeed for %s\n"
    , sympath);   
  11.     return 0;  
  12. }  


編譯與執行:

[[email protected] unixc]# rm -f /tmp/myfile /tmp/mysymlink
[[email protected] unixc]# ls -l /tmp/myfile /tmp/mysymlink
ls: cannot access /tmp/myfile: No such file or directory
ls: cannot access /tmp/mysymlink: No such file or directory
[[email protected] unixc]# echo "123456789" > /tmp/myfile
[

[email protected] unixc]# ls -l /tmp/myfile /tmp/mysymlink
ls: cannot access /tmp/mysymlink: No such file or directory
-rw-r--r--. 1 root root 10 Nov  5 02:36 /tmp/myfile
[[email protected] unixc]# cc x.4.17.1.c
[[email protected] unixc]# ./a.out
symlink succeed for /tmp/mysymlink
[[email protected] unixc]# ls -l /tmp/myfile /tmp/mysymlink
-rw-r--r--. 1 root root 10 Nov  5 02:36 /tmp/myfile
lrwxrwxrwx. 1 root root 11 Nov  5 02:36 /tmp/mysymlink -> /tmp/myfile
[[email protected] unixc]# rm -f /tmp/myfile /tmp/mysymlink
[[email protected] unixc]# ls -l /tmp/myfile /tmp/mysymlink
ls: cannot access /tmp/myfile: No such file or directory
ls: cannot access /tmp/mysymlink: No such file or directory
[[email protected] unixc]# ./a.out
symlink succeed for /tmp/mysymlink
[[email protected] unixc]# ls -l /tmp/myfile /tmp/mysymlink
ls: cannot access /tmp/myfile: No such file or directory
lrwxrwxrwx. 1 root root 11 Nov  5 02:37 /tmp/mysymlink -> /tmp/myfile
[[email protected] unixc]# 

分析:

(1)先刪除掉/tmp/myfile和/tmp/mysymlink

(2)echo一個/tmp/myfile

(3)編輯執行,成功執行並建立了一個符號連結:lrwxrwxrwx. 1 root root 11 Nov  5 02:36 /tmp/mysymlink -> /tmp/myfile

(4)再刪除掉/tmp/myfile和/tmp/mysymlink,讓/tmp/myfile的情況下symlink看看

(5)結果在/tmp/myfile不存在的情況下symlink成功了。

二、readlink函式

readlink函式用於讀取符號連結檔案本身資料(一個字串,用來表達要指向的檔案的路徑),而不是指向的檔案的資料。也就是取出呼叫symlink函式時寫入的actualpath

函式原型:

  1. #include <unistd.h>
  2. ssize_t readlink(constchar* restrict pathname, char *restrict buf, size_t bufsize);  
返回值:如果讀取成功則返回實際讀到的位元組數,否則返回-1

引數:

pathname 符合連結檔案的路徑

buf 存放取出資料的指標

bufsize 要取出的資料的位元組數

readlink函式實際上組合了open、read和close的所有操作。函式不會在buf的最後自動加null字元終止符,所以呼叫printf輸出之前要添上去。

例項 x.4.17.2.c

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #define BUFFSIZE 1024
  4. int main(void)  
  5. {  
  6.     char     sympath[] = "/tmp/mysymlink";  
  7.     ssize_t  size;  
  8.     char     buf[BUFFSIZE];  
  9.     if ((size = readlink(sympath, buf, BUFFSIZE)) < 0) {  
  10.         printf("readlink error for %s", sympath);  
  11.         return 1;  
  12.     } else {  
  13.         buf[size] = '\0';  
  14.         printf("%s\n",buf);  
  15.     }  
  16.     return 0;  
  17. }  

編譯與執行:

[[email protected] unixc]# rm -f /tmp/mysymlink
[[email protected] unixc]# cc x.4.17.1.c -o mysyml
[[email protected] unixc]# ./mysyml
symlink succeed for /tmp/mysymlink
[[email protected] unixc]# ls -l /tmp/mysymlink
lrwxrwxrwx. 1 root root 11 Nov  5 03:05 /tmp/mysymlink -> /tmp/myfile
[[email protected] unixc]# cc x.4.17.2.c
[[email protected] unixc]# ./a.out
/tmp/myfile
[[email protected] unixc]#

分析:

(1)把例項 x.4.17.1.c編譯為 mysyml,然後呼叫./mysyml建立一個符號連結

(2)編譯本例,執行./a.out

相關推薦

symlinkreadlink函式-符號連結

一、symlink函式 symlink函式用於建立一個符號連結檔案。函式原型: #include <unistd.h> int symlink(constchar *actualpath, constchar *sympath);   返回值:如果建

4.17 symlinkreadlink函式-符號連結

一、symlink函式 symlink函式用於建立一個符號連結檔案。函式原型: #include <unistd.h> int symlink(const char *actualpath, const char *sympath); 返回值:如果建立成功則

Linux C -> symlink readlink -> 符號鏈接

har dir 參數 存儲 不存在 ssi 連接 而不是 linu Linux C -> symlink 和 readlink -> 符號鏈接 -----------------------------------------------------------

InformixDB2符號連結漏洞解析

前言 IBM下有兩款大型關係型資料庫,分別是Informix和DB2。早在2001年和2003年兩款資料庫就被爆出存在符號鏈***提權的問題。尤其2003年Snosoft一口氣釋出了DB2數個關鍵工具存在符號連結***提權的問題。 符號鏈***雖然是一種本地***,但符號鏈***會造成非常嚴重的安全問

符號連結檔案連結檔案

□□實驗6-11.針對符號連線檔案和硬連線檔案。 測試以下函式,分析其執行過程並給出結論。 link(),unlink(),symlink(),readlink(),stat(),lstat() 1.Stat();lstat(); 分析:b檔案為a檔案的軟連線檔案,從

linux下建立symlink、symlinkatreadlink、readlinkat

linux下建立和讀取符號連結symlink、symlinkat和readlink、readlinkat函式使用心得。 程式碼: #include<unistd.h> int symlink(const char*actualpath,const ch

Ubuntu 連結ln的使用:建立刪除符號連結

對於一個檔案來說,有唯一的索引接點與之對應,而對於一個索引接點號,卻可以有多個檔名與之對應。因此,在磁碟上的同一個檔案可以通過不同的路徑去訪問該檔案。注意在Linux下是一切皆檔案的啊,資料夾、新加的硬碟 ...都可以看著檔案來處理的啊。 連線有軟連線和硬連線(hard link)之分的

圖解符號連結連結的區別i節點的介紹

我們先來介紹一些linux檔案系統的知識。我們知道 linux中一個檔案具有很多屬性,uid,gid,檔案大小,訪問許可權,檔案內容block位置等。這些內容是和檔案中的實際內容分開放的。檔案的屬性是放在叫做 i節點的結構中 ,而檔案內容則放在資料塊中。這個 inode(i

Linux上建立更改硬連結符號連結

概述 在本篇中,學習建立和管理硬連結和符號連結。學習: 建立硬或軟連結識別連結並知道它們的型別理解複製與連結檔案之間的區別使用連結執行系統管理任務 連結簡介 在儲存裝置上,檔案或目錄包含在一些資料塊中。有關某個檔案的資訊包含在一個 inode 中,它記錄了所有者、最後

Linux硬連結符號連結的區別

什麼是目錄 Linux檔案系統是樹狀結構的。根目錄下存在一系列子目錄。目錄裡邊有檔案或者子目錄。 但問題在於: 1. 目錄是什麼? 2. 檔案又是什麼? 檔案是:資料+屬性(比如名字、建立時間、所有者之類) 目錄是:一個列表,列表中的每一項是:in

printfscanf函式、unsigned無符號運算子

#include <stdio.h> int main() {int k=5, i=0;//定義的同時初始化short n=2;long j=10;char ch='0';//字串double db=5.5;float fdx=15.5;k = 10;//執行

HDFS符號連結連結

前言 初看這個標題,可能很多人會心生疑問:符號連結和硬連結是什麼意思?這些概念不是在Linux作業系統下才有的嘛,HDFS目前也有?當然大家可能還會有其他疑問,沒關係,在後面的內容講述中答案會一一揭曉。歸納起來一句話:不管是符號連結還是硬連結,它們本質上都

活用clonetrigger函式,點選按鈕原有事件不觸發,之後再觸發原有事件

活用clone和trigger函式,點選按鈕原有事件不觸發,之後再觸發原有事件 需求: 網站開發完畢了,然後產品說要在原來的’確認按鈕’點選後加一個’彈窗’提醒使用者一些注意事項,在使用者點選彈窗裡面的’同意按鈕’後再執行原來’確認按鈕’ 裡面繫結的事件。需求看起來很簡單,但是有一個要

順序表模板雙向帶頭迴圈連結串列模板

類的類名和型別 從在類內定義順序表模板的建構函式和類內宣告類外定義建構函式來區別類名和 型別: #include<iostream> #include<stdlib.h> #include<string> using namespace std;

pytorch的packunpack函式

pack unpack 匯入 from torch.nn.utils.rnn import pack_padded_sequence as pack from torch.nn.utils.rnn import pad_packed_sequence as unpack 使

使用類的靜態欄位建構函式,可以跟蹤某個類所建立物件的個數

  package TongJi; public class Duixiang { private static int n; public Duixiang() { n++; } public static int g

SOCKET程式設計流位元組粘包問題readnwriten函式封裝

#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #

C++11新特性——default函式deleted函式

轉自:http://blog.jobbole.com/103669/ default函式 default函式作用於類的特殊成員函式,為其自動生成預設的函式定義體,提高程式碼的執行效率。 類的特殊成員函式: 預設建構函式 解構函式 複

C語言中static修飾的函式普通函式的區別

用static修飾的函式,本限定在本原始碼檔案中,不能被本原始碼檔案以外的程式碼檔案呼叫。而普通的函式,預設是extern的,也就是說,可以被其它程式碼檔案呼叫該函式。 在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。普通 函式的定義和宣告預設情況下是extern的,但靜