函數原型: int unlink(char *pathname); 一、文件系統基礎. 理解unlink()之前,先要對unix的文件系統有基本的了解.一個unix文件系統由4個部分組成: 自舉塊,超級塊,i表,目錄塊和數據塊. 而現在,我們需要關心的僅僅是後兩部分. 1、i表。 是i節點的集合.i節點是一個固定長度的記錄項(通常是64位元組或128位元組,不同的文件系統其長度可能不一樣),它包含文件的相關信息:文件類型,文件長度,文件存取許可,和指向實際的數據塊的指針等,以及一個連接計數,用以指示連接到此i節點的目錄項的數目.不知道什麼是目錄項? 不要緊,馬上就會講到. 2、目錄塊和數據塊. 數據塊,不用我講,相信都知道是文件實際在磁碟上的數據了吧! 目錄塊,是目錄項的集合.每一個目錄項中包含2個數據:文件名,i節點號.文件名就是通常我們用ls命令所看到的,i節點號就是該目錄項所連接到的i節點. 3、連接到i節點. 可能有細心的朋友就已發現,i節點中的連接計數是用來干什麼的?那是因為unix允許多個目錄項指向同一個文件數據(指向同一i節點).有多少個目錄項指向同一i節點,此i節點連接計數就等於多少. 如果仍然有人對文件系統的結構不太清楚,那麼請看下面這2個圖: 對上面幾個概念的認識,讓我們知道unix的文件系統的用戶介面就是目錄項,那麼我們通過目錄項訪問文件的過程就應該是,內核根據目錄項的i節點號找到對應的i節點,再通過i節點返迴文件的屬性,或者讀取文件的實際數據內容.但為什麼unix要採用三層結構(目錄項--i節點--數據塊)管理文件呢? 例如為什麼不是直接將文件名放入i節點採用二層結構?這個相信大家自己不難理解. 二、unlink()函數 終於到unlink()函數了.很多人都知道unlink()的作用是刪除文件,這是因為大多數時候一個文件只被一個目錄項連接,而不知道實際上它的作用是僅僅是刪除指定的目錄項,以及將此目錄項對應的文件的連接計數減一.如果還有其他的目錄項連接到此文件,可以通過其他目錄項讀取文件內容.只有當文件的連接計數為0時,內核才將文件內容刪除. #include #include #include #include int main() { int fd; char buff[30]; fd = creat("test1",777); if (fd == -1) { printf("creat file error!!\n"); return 1; } write(fd,"this is a test",30); close(fd); link("test1","test2"); /*新建一個連接到test1的目錄項*/ system("ls"); /*查看是否有此2文件*/ unlink("test1"); system("ls"); /*查看是否將test1刪除*/ fd = open("test2",O_RDONLY); if (fd == -1) { printf("open file error!!\n"); return 1; } read(fd,buff,30); printf("content of file test2: %s\n",buff); close(fd); return 0; } 但也有可能,一個文件的連接只有一個,但調用unlink之後,文件不存在了,磁碟空間卻仍然沒有得到釋放.看下面這個例子: int main() { int fd; char buff[30]; fd = creat("test1",777); if (fd == -1) { printf("creat file error!!\n"); return 1; } fd = open("test1",O_WRONLY); if (fd == -1) { printf("open file error!!\n"); return 1; } write(fd,"this is a test",30); close(fd); system("df"); /*刪除前列印出文件系統的磁碟空間使用情況*/ unlink("test1"); system("ls"); /*查看是否刪除成功*/ system("df"); /*刪除後列印出文件系統的磁碟空間使用情況*/ return 0; } 運行此程序你會發現刪除前後磁碟空間完全沒有變化,但ls時,文件確實已經不在了.這又是為什麼呢?哦,你已經發現了,文件被打開2次,但只關閉了一次.問題就在這里,內核對於每個被打開的文件,保存有其打開的進程計數,關閉一個文件時,內核先檢查其打開的進程計數,如果為0,再檢查其連接計數,如果也為0,才會刪除文件內容.當程序退出或返回,內核自動關閉所有被進程打開的文件,這就是為什麼當程序運行結束後,再調用df查看時,磁碟空間已經釋放的原因. unlink的這個特性也常被用來確保即使是在程序崩潰時,其所創建的臨時文件也不會保存下來.在用open或creat創建一個文件之後,馬上調用unlink(),這樣因為文件仍然是打開的,所以內容不會被刪除.而當程序退出時(正常或異常),內容就會被自動刪除.
⑵ unix如何找頭文件
#include <> 通常是用來加入系統中已有的的頭文件的,編譯器會優先搜索 「/usr/include"目錄中的頭文件消答螞,如果沒有再搜索當前目錄
#include "" 通常是用來加入自定義的頭文件,編譯器在預處理的時候會優先搜索當前的目錄,拿埋如果沒有才會去「/usr/include」目錄中找
兩個用法舉廳,區分的並不是特別的嚴格
不和C源文件在同一個目錄中,需要用在include "" 中指定,存放,*.h文件的絕對路徑即可
⑶ VS編譯缺少unistd.h頭文件
許多在linux下開發的C程序都需要頭文件unistd.h,但VC中碼核沒有這個頭遲唯掘文件,所以用VC編譯總是報錯。把下面的內容保存為unistd.h,可以解決這個問題。
unistd.h是unix std的意思,是POSIX標準定義的unix類系統定義符號常量的頭文件,包含了許多UNIX系統服務的函數原型,例如read函數、write函數和getpid函數山纖。 unistd.h在unix中類似於window中的windows.h 。
⑷ unix系統的頭文件和庫文件在哪裡
默認編譯器的頭文件路徑為 /usr/include
默認的動態庫搜索路徑/lib、/usr/lib
⑸ unistd.h頭文件的作用或什麼意思
#include <unistd.h>
是POSIX標準定義的unix類系統定義符號常量的頭文件,包含了許多UNIX系統服務的函數原型,例如read函數、write函數和getpid函數
#ifndef _UNISTD_H
#define _UNISTD_H
#include <features.h>
unistd.h含有灶沖的常量與函數:
ssize_t read(int, void *, size_t);
int unlink(const char *);
ssize_t write(int, const void *, size_t);
int usleep(useconds_t);
unsigned sleep(unsigned);
int access(const char *, int);
unsigned alarm(unsigned);
int chdir(const char *);
int chown(const char *, uid_t, gid_t);
int close(int);
size_t confstr(int, char *, size_t);
void _exit(int);
pid_t fork(void);
NULL /胡昌/ Null pointer
SEEK_CUR //隱做殲 Set file offset to current plus offset.
SEEK_END // Set file offset to EOF plus offset.
SEEK_SET // Set file offset to offset.
⑹ linux 的sleep()、usleep()、nanosleep()函數
原文地址: https://blog.csdn.net/weibo1230123/article/details/79139476
sleep()非系統調用,sleep()是在庫函數中實現的,它是通過alarm()來設定報警時間,使用sigsuspend()將進程掛起在信號SIGALARM上。
sleep()只能精確到秒級上。sleep()會令目前的進程暫停,直到達到參數seconds 所指定的時間,或是被信號所中斷。
return:若進程暫停到參數seconds 所指定的時間,成功則返回0,若有信號中斷則返回剩餘秒數。
除了時間單位為微秒以外,在使用上與sleep()差不多。還有就是實現也是不同的,sleep因為是用alarm實現的,所以時間單位為s ,而usleep的時間單位為us
,那肯定不是由alarm實現的,所以說它們的實現不同,但都是linux用的,而window下不能用,因為都是sleep和usleep都是在unistd.h下定義的。
return:若進程暫停到參數seconds 所指定的時間,成功則返回0,若有信號中斷則返回剩餘微秒數。
這個函數功能是暫停某個進程直到你規定的時間後恢復,參數req就是你要暫停的時間,其中req->tv_sec是以秒為單位,而tv_nsec以毫微秒為單位(10的-9次方秒)。由於調用nanosleep是是進程進入TASK_INTERRUPTIBLE,這種狀態是會相應信號而進入TASK_RUNNING狀態的,這就意味著有可能會沒有等到你規定的時間就因為其它信號而喚醒,此時函數返回-1,切還剩餘的時間會被記錄在rem中。
return: 若進程暫停到參數 req所指定的時間,成功則返回0,若有信號中斷則返回-1,並且將剩餘微秒數記錄在 rem中。
unistd.h 是 unix 系統標准頭文件,用於系統調用,相當於win32中的windows.h,unistd.h 定義的函數只能用於UNIX環境中,而不能用於windows。所以sleep 和 usleep 只能用於linux下,而不能用於windows 。
nalosleep 和 其它時間日期操作函數一樣都是定義在time.h中的,所以都適用
⑺ 本人是小白,請問UNIX書中./a.ou是什麼文件,還有「apue.h「頭文件是自己寫的嗎程序寫在vi里怎麼運行
關於./a.out
以C語言為例,linux下假設有test.c文件,gcc編譯後(不加-o)選差基項默認生成察慶凱的可執行文件名就是a.out,也就是說a.out文件是一個可執行文件。./a.out表示執行該可執行文件
apue.h是自己寫的,《UNIX環境高級編程》中附錄B(677頁)中有源碼
假設你用vi編輯了一個test.c文件,計算機是無法直接讀懂該文件的,細說的話要經過預處理、編譯、匯編、鏈接等操作後才生成計算機能讀懂的文件,也就是我剛才說的可執行文件那種。對於C初學者,你需要藉助編譯器gcc:
$gcc test.c
執行這個命令後再當前目錄下執行ls,會發現多了一個a.out的可執行文件,然後執行./a.out就可以運行程序了。gcc可以加上-o選項,如:
$gcc test.c -o test.exe
-o選項表示指定生成文件敗喚的名稱。gcc還有很多選項,深入學習的話可以網路或者gcc -help之類的命令查看
⑻ Unix\Linux程序設計 中作者自己設計的頭文件在哪裡
http://proct.china-pub.com/301
找買的巧首粗光碟或者
電子書下芹含載孝鎮
⑼ unix下gcc添加系統頭文件搜索路徑應該使用哪個選項
$ gcc -I XXX ......
-I參數代表添檔渣加頭文件搜索的哪蠢明路徑,XXX是路徑
此外環境變數$C_INCLUDE_PATH的值李告也會被自動加入編譯過程
⑽ unix環境編程 頭文件「apue.h」
是在apue.2e目錄運行的make嗎,我運行沒問物答老題,只是罩升出現一個程序舉手錯誤。