函数原型: 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吗,我运行没问物答老题,只是罩升出现一个程序举手错误。