link、symlink、readlink、unlink函数的使用

#include <unistd.h>

int link(const char *oldpath, const char *newpath);

作用:创建一个硬链接      0成功   -1 失败

//代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char* argv[])
{if(argc < 3){printf("a.out oldpath newpath\n");exit(0);}int ret = link(argv[1], argv[2]);if(ret == -1){perror("link");exit(1);}return 0;
}

#include <unistd.h>

int symlink(const char *oldpath, const char *newpath);

作用:创建一个软链接    0成功  -1失败

 

#include <unistd.h>

ssize_t readlink(const char *path, char *buf, size_t bufsiz);

作用:读一个软链接文件其本身的内容(即所链接的那个文件的文件路径或文件名),不是去读文件内容,将内容读到buff缓冲区(由用户维护)。 注意:该函数只能用于软链接文件。

返回值:成功则返回读取的字节数;失败则为-1。

//代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char* argv[])
{if(argc < 2){printf("a.out softlink\n");exit(1);}char buf[512];int ret = readlink(argv[1], buf, sizeof(buf));if(ret == -1){perror("readlink");exit(1);}buf[ret] = 0;  // 必须的,赋值为0或\0表示字符串结束符,该位及以后的字符不再输出,如果需要输出,可以采用循环一个一个的输出。printf("buf = %s\n", buf);return 0;
}

#include <unistd.h>

int unlink(const char *pathname);

作用:1. 如果是符号链接,删除符号链接(即直接删除该文件);2. 如果是硬链接,硬链接数减1(简化的FCB),当减为0时,释放数据块和inode;3. 如果文件硬链接数为1,但有进程已打开该文件,并持有文件描述符,则等该进程关闭该文件时,kernel才真正去删除该文件。第3个作用可以让临时文件关闭之后自己把自己删除掉利用该特性创建临时文件,先opencreat创建一个文件,马上unlink此文件。unlink后,所有使用该文件的进程结束以后,文件才会被删除,这些进程在未结束时,unlink删除的只是文件的目录项(此时文件已经具有了被删除的条件,硬链接数为0),文件本身的内容即inode未被删除。以如下代码为例。

返回值:0成功  -1失败

//临时文件自己把自己干掉

[root@localhost work]# vim tmp.c

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>int main( )
{int fd;fd = open( "unlink",O_RDWR | O_CREAT,0664);  //没有就创建该文件if( fd == -1 ){perror("open file");exit(1);}//打开后立即unlink文件(删除文件)int fd1;fd1==unlink("unlink");if( fd1 == -1 ){perror("unlink file");exit(1);}//为了证明该文件确实被存在过,则在关闭文件之间进行读、写和打印测试int fd2;fd2 = write(fd,"hello unlink!\n",14);if( fd2 == -1 ){perror("write file");exit(1);}int ret;ret = lseek(fd,0,SEEK_SET);  //将文件读写指针置于开头才能读if( ret == -1 ){perror("lseek file");exit(1);}int fd3;char buff[15]={0};fd3 = read(fd,buff,15);if( fd3 == -1 ){perror("read file");exit(1);}int fd4;fd4 = write(1,buff,fd3);if( fd4 == -1 ){perror("write file");exit(1);}int ret1=close(fd);if( ret1 == -1 ){perror("close file");exit(1);}return 0;
}

[root@localhost work]# ./tmp

hello unlink!

[root@localhost work]# ls         //可见,没有unlink文件,自己把自己删除了

english.txt  ls-l.c  stat.c  statuse  statuse.c  tmp  tmp.c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode】113. 路径总和 II

给定一个二叉树和一个目标和&#xff0c;找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c; 5 / \ 4 8 / / \ …

目录操作相关的系统函数

主要介绍几个常用函数的使用方法&#xff1a;chdir&#xff08;改变进程的当前工作目录&#xff09;、getcwd&#xff08;获取当前进程的工作目录&#xff09;、mkdir&#xff08;创建目录&#xff09;、rmdir&#xff08;删除空目录&#xff09;、opendir&#xff08;打开一个…

1079. Total Sales of Supply Chain (25)

A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

chdir、getcwd、mkdir、rmdir函数

#include <unistd.h> int chdir(const char *path); int fchdir(int fd); 作用&#xff1a;改变调用这一函数的进程&#xff08;即程序执行&#xff09;的当前工作目录&#xff0c;注意不是shell的当前工作目录。 返回值&#xff1a;0成功 -1失败 #include <unis…

【Leetcode | 235】 235. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己…

1090. Highest Price in Supply Chain (25)

A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;经销商&#xff09;, and suppliers&#xff08;供应商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

opendir、readdir和closedir函数

注意&#xff1a;在Linux中&#xff0c;目录的输入格式&#xff1a;/mnt//fghs、/mnt/fghs、/mnt/fghs和/mnt/fghs//是等效的&#xff0c;都一样。 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); DIR *fdopendir(int fd); 返回…

146. LRU缓存机制

运用你所掌握的数据结构&#xff0c;设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作&#xff1a; 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中&#xff0c;则获取密钥的值&#xff08;总是正数&#xff09;&#xff…

dup和dup2函数

#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); 作用&#xff1a;dup函数实现对一个文件的文件描述符进行复制&#xff0c;复制之后该进程就会新增加一一个文件描述符指向该文件&#xff08;即实现同一个文件对应多个文件描述符&#xff0…

fcntl函数(网络编程会用)

#include <unistd.h> #include <fcntl.h> int fcntl&#xff08;int fd, int cmd&#xff09;&#xff1b; int fcntl&#xff08;int fd, int cmd, long arg&#xff09;&#xff1b;//long 长整型 int fcntl&#xff08;int fd, int cmd, struct flock *lock…

189. 旋转数组

给定一个数组&#xff0c;将数组中的元素向右移动 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] 和 k 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]示例 2: 输…

58. 最后一个单词的长度

给定一个仅包含大小写字母和空格 的字符串&#xff0c;返回其最后一个单词的长度。 如果不存在最后一个单词&#xff0c;请返回 0 。 说明&#xff1a;一个单词是指由字母组成&#xff0c;但不包含任何空格的字符串。 示例: 输入: "Hello World" 输出: 5 clas…

CPU和MMU(内存管理单元)

CPU的架构&#xff1a;要求能够理解从源程序到微指令的整个经历过程&#xff1a;存储器的层次结构&#xff08;网络资源下载到硬盘、磁盘缓存、内存、Cache、寄存器&#xff09;&#xff1b;CPU的四大部分&#xff1a;ALU、CU、中断系统和寄存器&#xff1b;程序执行的整个过程…

【C++ Primer | 09】容器适配器

一、stack s.push(): 向栈内压入一个成员&#xff1b; s.pop(): 从栈顶弹出一个成员&#xff1b; s.empty(): 如果栈为空返回true&#xff0c;否则返回false&#xff1b; s.top(): 返回栈顶&#xff0c;但不删除成员&#xff1b; s.size(): 返回栈内元素…

进程控制块PCB(进程描述符)

&#xff08;1&#xff09;PCB 每个进程在内核中都有一个进程控制块&#xff08;PCB&#xff09;来维护进程相关的信息&#xff0c;Linux内核的进程控制块是task_struct结构体。grep -r “task_struct” / 可以查找根目录下&#xff0c;包含task_struct的文件文件。或者 find…

103. 二叉树的锯齿形层次遍历

给定一个二叉树&#xff0c;返回其节点值的锯齿形层次遍历。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 例如&#xff1a; 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 /…

fork、getpid、getppid函数

#include <unistd.h> pid_t fork(void); 作用&#xff1a;创建一个子进程。 到目前为止&#xff0c;我们可以直到两种创建进程的方法&#xff1a;1. 通过执行二进制文件来创建一个进程&#xff0c;如&#xff1a;./a.out /bin/ls&#xff1b;2.通过fork函数来创建一个…

107. 二叉树的层次遍历 II

给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 例如&#xff1a; 给定二叉树 [3,9,20,null,null,15,7], 3/ \9 20/ \15 7返回其自底向上的层次遍历为&#xff…

循环创建N个子进程

以循环创建5个进程为例&#xff0c;给出如下代码&#xff0c;分析其错误&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h>int main(void) {int i;pid_t pid;printf("xxxxxxxxxxx\n");for (i 0; i < 5; i){pid fork…

【C++ Primer | 19】控制内存分配

1. 测试代码&#xff1a; #include <iostream> #include <new> #include <cstring> #include <cstdlib> using namespace std;void* operator new(size_t size) {cout << "global Override operator new" << endl;if (void* p…