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

4.17 symlink和readlink函式-符號連結

一、symlink函式

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

#include <unistd.h>
int symlink(const char *actualpath, const char *sympath);

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

引數:

actualpath 要指向的路徑

sympath 被建立的新目錄項路徑

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

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

例項 x.4.17.1.c

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    char     actualpath[] = "/tmp/myfile";
    char     sympath[] = "/tmp/mysymlink";

    if (symlink(actualpath, sympath) == -1)
        printf("symlink error for %s\n", sympath); 
    else
        printf("symlink succeed for %s\n", sympath); 

    return 0;

}


編譯與執行:

[[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

函式原型:

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

引數:

pathname 符合連結檔案的路徑

buf 存放取出資料的指標

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

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

例項 x.4.17.2.c

#include <stdio.h>
#include <unistd.h>

#define BUFFSIZE 1024

int main(void)
{
    char     sympath[] = "/tmp/mysymlink";
    ssize_t  size;
    char     buf[BUFFSIZE];

    if ((size = readlink(sympath, buf, BUFFSIZE)) < 0) {
        printf("readlink error for %s", sympath);
        return 1;
    } else {
        buf[size] = '\0';
        printf("%s\n",buf);
    }
    
    return 0;

}

編譯與執行:

[[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

相關推薦

4.17 symlinkreadlink函式-符號連結

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

symlinkreadlink函式-符號連結

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

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

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

4.15 link、unlink函式-建立刪除硬連結

link函式用於建立一個指向已存在檔案的新目錄項。函式原型如下: #include <unistd.h> int link(const char *existingpath, const char *newpath); 返回值:若成功則返回0,若失敗則返回-

4-17 遞迴計算Ackermenn函式 (10分)

本題要求實現Ackermenn函式的計算,其函式定義如下: 函式介面定義: int Ack( int m, int n ); 其中m和n是使用者傳入的非負整數。函式Ack返回Ackermenn函式的相應值。題目保證輸入輸出都在長整型 範圍內。 裁判測試程式

4天----迴圈函式

文章目錄迴圈結構函式函式的概念優化函式 昨天知識總結 1.進位制轉換 >二進位制,八進位制,十六進位制,十進位制 > 2.資料型別 >有符號型 >簡單資料型別 >數值型 >浮點型 >布林型 >字元型 >引用

InformixDB2符號連結漏洞解析

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

vue2.0專案實戰(4)生命週期鉤子函式詳解

最近的專案都使用vue2.0來開發,不得不說,vue真的非常好用,大大減少了專案的開發週期。在踩坑的過程中,因為對vue的生命週期不是特別瞭解,所以有時候會在幾個鉤子函式裡做一些事情,什麼時候做,在哪個函式裡做,我們不清楚。 下面來總結一下vue的生命週期。 vue生命週期簡介 咱們從上圖可以很明顯的看出

Python3.4中filter函式,map函式reduce函式

filter函式: filter()為已知的序列的每個元素呼叫給定的布林函式,呼叫中,返回值為非零的元素將被新增至一個列表中>>> def f1(x): if x > 20: return True else: return False >&

利用函式模板求4個數的。 部分程式碼已給定如下,只需要提交缺失的程式碼

#include <iostream> using namespace std; /* 補充缺少程式碼 */ template<typename Groap> Groap sum(Groap a,Groap b,Groap c,Groap d)

WIN7安裝MongoDB3.4.174.0

3.4.17安裝: 下載:Mongo官網 下載下來的msi,傻瓜式的安裝點下一步就行了   安裝完之後,我們還需要一些配置 我這是在C盤C:\MongoDB\data下建立的幾個資料夾。 其中db和dblog裡面是空的,不需要新增什麼。 config

C語言指標導學(4)——分清函式指標指標函式

四.分清函式指標和指標函式 關於指標和陣列斬不斷理還亂的恩怨還真是說了不少,不過現在應該已經理清了。有了上一講的基礎,本講的內容相對來說就比較容易理解了。 1.指向函式的指標(函式指標) 來分析這樣一個宣告,void (*f) ( );雖然( )的優先順序高於*,但由於有括號

符號連結檔案連結檔案

□□實驗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

Android函式響應式程式設計——RxJava的4大subject執行緒控制

Subject Subject既可以是一個Observer也可以是一個Observable,它用來連線兩者。所以Subject被認為是Subject=Observable+Observer 1.PublishSubject PublishSubject在被建立完成之後立刻開

windows(4)修改視窗過程函式的機制論證

    修改視窗類的視窗過程,能夠讓所有用這個視窗類來建立的視窗都改變了視窗過程嗎?或者換句話說,修改視窗過程,會讓修改應用於後面建立的視窗上嗎?更或者說,註冊的視窗類資訊(視窗過程)永久修改了嗎?     如果你有這些疑問,那麼就繼續往下看吧。     不管是系統視窗類,還是應用程式的視窗類(區域性和全

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

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

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

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

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

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

Linux硬連結符號連結的區別

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