#includeoldpath : 用于指定被链接的源文件路径,应避免 oldpath 参数指定为软链接文件,为软链接文件创建硬链接没有意义,虽然并不会报错。 newpath : 用于指定硬链接文件路径 。 返回值: 成功返回 0 ;失败将返回 -1 ,并且会设置 errno 。int link(const char *oldpath, const char *newpath);
#include成功: 0 ;失败: -1 设置 errno 为相应值. 1:编程实现 mv 命令的改名操作int unlink(const char *pathname);
#include注意 Linux 下删除文件的机制:不断将 st_nlink -1 ,直至减到 0 为止。无目录项对应的文件,将会被操作系统择机释放。( 具体时间由系统内部调度算法决定 )因此,我们删除文件,从某种意义上说,只是让文件具备了被释放的条件。 unlink 函数的特征: 清除文件时,如果文件的硬链接数到 0 了,没有 dentry 对应,但该文件仍不会马上被释放。要等到所有打开该文件的进程关闭该文件,系统才会挑时间将该文件释放掉。 2:实现: 在进程运行中创建临时文件,在进程关闭的时候关闭该临时文件。并且在出现错误的时候 因为后面文件没有被unlink,也没有被close,这是不允许的,即程序崩了,该临时文件不应该被创建。#include #include int main(int argc, char * argv[]) { int ret = link(argv[1],argv[2]); if(ret == -1) { perror("link error"); exit(1); } unlink(argv[1]); return 0; }
#include#include #include #include #include int main(void) { int fd, ret; char *p = "test of unlinkn"; char *p2 = "after write something.n"; fd = open("temp.txt", O_RDWR|O_CREAT|O_TRUNC, 0644); if(fd < 0){ perror("open temp error"); exit(1); } ret = unlink("temp.txt"); //具备了被释放的条件 if(ret < 0){ perror("unlink error"); exit(1); } ret = write(fd, p, strlen(p)); if (ret == -1) { perror("-----write error"); } printf("hi! I'm printfn"); ret = write(fd, p2, strlen(p2)); if (ret == -1) { perror("-----write error"); } printf("Enter anykey continuen"); getchar(); p[3] = 'H'; close(fd); return 0; }
temp.txt不会立即释放,所以在写入数据write的时候,并不会报错,而是写入到了内核缓冲区。在出现段错误的时候该临时文件temp.txt并不会生成,
隐式回收 当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会被释放。系统的这一特性称之为隐式回收系统资源。 由于段错误,文件没有被close,但是在程序退出的时候,操作系统会在程序结束运行时会隐式回收,但是自己写程序的时候应避免这点。


