当前位置:首页 » 操作系统 » linuxunlink

linuxunlink

发布时间: 2022-03-15 17:22:58

A. linux shell中,unlink和rm命令有什么区别

strace 跑 rm 与 unlink,结果有不同地方.

1. strace rm 1.txt 片段

access("1.txt", W_OK) = 0

unlinkat(AT_FDCWD, "1.txt", 0) = 0

复制代码

2. strace unlink 2.txt 片段

unlink("2.txt") = 0

复制代码

我想可以再看看 unlink 与 unlinkat 的 manpage 说明应该有答案 ?

The unlinkat() system call operates in exactly the same way as either unlink(2) or rmdir(2) (depending on

whether or not flags includes the AT_REMOVEDIR flag) except for the differences described in this manual

page.

AT_REMOVEDIR

By default, unlinkat() performs the equivalent of unlink(2) on pathname. If the AT_REMOVEDIR flag

is specified, then performs the equivalent of rmdir(2) on pathname.

复制代码

测试用 strace rm -r testdir 方式删除一个目录与其下的档案目录,结果为:

access("testdir", W_OK) = 0

unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0

复制代码

所以结论一般命令用 rm 或是 unlink 都可以删除档案,因为都是一样的意思。系统面呼叫来说删除档案一般还是使用 unlink() 呼叫,只是有另外提供 unlinkat 提供相同机制,但是可以删除档案或是空目录。

B. PHP 怎样处理用unlink删除文件出现的异常

拒绝访问,貌似linux下吧,应该是你所在的用户权限不够,如果有ftp权限的,就把欲删除的文件的权限改成777

C. linux shell中,unlink和rm命令有什么区别

strace 跑 rm 与 unlink,结果有不同地方.

1. strace rm 1.txt 片段

access("1.txt", W_OK) = 0
unlinkat(AT_FDCWD, "1.txt", 0) = 0

2. strace unlink 2.txt 片段

unlink("2.txt") = 0

我想可以再看看 unlink 与 unlinkat 的 manpage 说明应该有答案 ? :)

The unlinkat() system call operates in exactly the same way as either unlink(2) or rmdir(2) (depending on
whether or not flags includes the AT_REMOVEDIR flag) except for the differences described in this manual
page.

AT_REMOVEDIR
By default, unlinkat() performs the equivalent of unlink(2) on pathname. If the AT_REMOVEDIR flag
is specified, then performs the equivalent of rmdir(2) on pathname.

测试用 strace rm -r testdir 方式删除一个目录与其下的档案目录,结果为:

access("testdir", W_OK) = 0
unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0

所以结论一般命令用 rm 或是 unlink 都可以删除档案,因为都是一样的意思。系统面呼叫来说删除档案一般还是使用 unlink() 呼叫,只是有另外提供 unlinkat 提供相同机制,但是可以删除档案或是空目录。

不过我想其他系统的 rm 与 unlink 是有差异的,比方 solaris 就不一样。

-bash-3.00$ uname -a
SunOS solaris 5.10 Generic_118855-33 i86pc i386 i86pc

man unlink :

System Administration Commands link(1M)

NAME
link, unlink - link and unlink files and directories

SYNOPSIS
/usr/sbin/link existing-file new-file

/usr/xpg4/bin/link existing-file new-file

/usr/sbin/unlink file

DESCRIPTION
The link and unlink commands link and unlink files and
directories. Only super-users can use these commands on
directories.

D. linux下中的 rm 命令选项-i 什么意思

-i:进行任何删除操作前必须先确认。

用户可以用rm命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。

(4)linuxunlink扩展阅读

linux下rm命令使用详解

rm命令的一般形式为:rm[选项]... 目录... 删除指定的<文件>(即解除链接)。

-d:删除可能仍有数据的目录 (只限超级用户)。


-f:略过不存在的文件,不显示任何信息。

-i:进行任何删除操作前必须先确认。

-r/R:同时删除该目录下的所有目录层。

-v :详细显示进行的步骤。

-help:显示此帮助信息并离开。

--version:显示版本信息并离开。

范例:

删除所有rb语言程序档;删除前逐一询问确认:rm-i *.rb。

将 Finished 子目录及子目录中所有档案删除:rm -r Finished。

将 Finished 子目录及子目录中所有档案删除,并且不用--确认:rm -rf Finished。

E. LINUX 怎么删除 文件link

每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数。
当通过shell的touch命令或者在程序中open一个带有O_CREAT的不存在的文件时,文件的链接数为1。

通常open一个已存在的文件不会影响文件的链接数。open的作用只是使调用进程与文件之间建立一种访问关系,即open之后返回fd,调用进程可以通过fd来read 、write 、 ftruncate等等一系列对文件的操作。
close()就是消除这种调用进程与文件之间的访问关系。自然,不会影响文件的链接数。在调用close时,内核会检查打开该文件的进程数,如果此数为0,进一步检查文件的链接数,如果这个数也为0,那么就删除文件内容。

link函数创建一个新目录项,并且增加一个链接数。
unlink函数删除目录项,并且减少一个链接数。如果链接数达到0并且没有任何进程打开该文件,该文件内容才被真正删除。如果在unlilnk之前没有close,那么依旧可以访问文件内容。

综上所诉,真正影响链接数的操作是link、unlink以及open的创建。
删除文件内容的真正含义是文件的链接数为0,而这个操作的本质完成者是unlink。close能够实施删除文件内容的操作,必定是因为在close之前有一个unlink操作。

举个例子简单说明:通过shell touch test.txt
1、stat("test.txt",&buf);
printf("1.link=%d\n",buf.st_nlink);//未打开文件之前测试链接数

2、fd=open("test.txt",O_RDONLY);//打开已存在文件test.txt
stat("test.txt",&buf);
printf("2.link=%d\n",buf.st_nlink);//测试链接数

3、close(fd);//关闭文件test.txt
stat("test.txt",&buf);
printf("3.link=%d\n",buf.st_nlink);//测试链接数

4、link("test.txt","test2.txt");//创建硬链接test2.txt
stat("test.txt",&buf);
printf("4.link=%d\n",buf.st_nlink);//测试链接数

5、unlink("test2.txt");//删除test2.txt
stat("test.txt",&buf);
printf("5.link=%d\n",buf.st_nlink);//测试链接数

6、重复步骤2 //重新打开test.txt

7、unlink("test.txt");//删除test.txt
fstat(fd,&buf);
printf("7.link=%d\n",buf.st_nlink);//测试链接数

8、close(fd);//此步骤可以不显示写出,因为进程结束时,打开的文件自动被关闭。

顺次执行以上8个步骤,结果如下:
1.link=1
2.link=1 //open不影响链接数
3.link=1 //close不影响链接数
4.link=2 //link之后链接数加1
5.link=1 //unlink后链接数减1
2.link=1 //重新打开 链接数不变
7.link=0 //unlink之后再减1,此处我们改用fstat函数而非stat,因为unlilnk已经删除文件名,所以不可以通过 文件名访问,但是fd仍然是打开着的,文件内容还没有被真正删除,依旧可以使用fd获得文件信息。
执行步骤8,文件内容被删除。。。。

F. linux下怎么删除kernel

sys_unlink 为系统调用, 若删除失败可以检查 errno 的值, 可能滴原因譬如路径、权限、正忙等 ... 若已经安装了 strace 这类东东, 可以用 strace rm file 滴方式看到都调用了那些动态链接滴函数 ...

G. linux用什么标识,描述和控制文件

Linux的文件标识符,和Windows的就是文件名不同,它相当于文件的一个指针。在linux的c语言中,除了用通用的《【C】文件读写问题》(点击打开链)中介绍过的fopen等c语言通用操作文件以外,其Linux应用请参考《【Linux】利用C语言文件流复制单一文件),还能用文件标识符还来操作文件。这也是Linux中C语言,最底层,最原始控制文件的方式,其函数open,read,write,close已经完美地表明这一点。同时,在Linux无论是文件、设备和管道,甚至是个可操作对象对可以视作文件来对待,具体表现为都可以用这个文件标识符来操作他们。
文件标识符非常独特,并不是指针,其变量类型就是大家非常常用的int。
至于这个东西怎么用,具体请看如下文件读写程序:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//文件控制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 512//缓冲区的大小
const char* FILEPATH="/tmp/file.txt";//文件目录
int main(void) {
int fd;//文件标识符,
char *s = "被折腾的文字";
char buffer[MAXSIZE+1];//用来接字符的缓冲区
int size;//读入的文件长度
if((fd=open(FILEPATH,O_CREAT|O_TRUNC|O_RDWR,0777))<0){
//O_CREAT如果指定文件不存在,则创建这个文件,O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
//O_APPEND每次写操作都写入文件的末尾,O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
//O_RDONLY只读模式,O_WRONLY只写模式,O_RDWR读写模式
//0777为最高权限
perror("打开文件失败!");
exit(1);
}
if((write(fd,s,strlen(s)))<0){
perror("写入文件失败!");
exit(1);
}
//lseek(fd,0,SEEK_SET);//即把文件指针移至buf文件的开始处
lseek(fd,-strlen(s),SEEK_END);//即把文件指针往从结尾处向前移动strlen(s)个字符
if((size=read(fd,buffer,MAXSIZE))<0){
perror("读入文件失败!");
exit(1);
}else{
buffer[size]='\0';//字符串数组封口
printf("%s\n",buffer);
}
if(close(fd)<0) {
perror("关键文件失败!");
exit(1);
}
unlink(FILEPATH);//删除文件
exit(0);
}
这个程序的一大堆头文件,是没办法的,因为所用到的函数需要的基本头文件就是这么多,但这些头文件都是Linux的基本头文件,能够拿来直接用。

程序首先打开并同时利用open的参数创建一个文件,之后向这个文件,通过read函数写入一个名为“缓冲区”buffer的字符数组,也就是字符串string的一些东西,然后,写入完毕,因为文件操作光标将会移到文件最后,所以我们要先将其移回文件头,再利用write函数读入这个文件的内容到buffer,并打印到屏幕,最后再用close关闭文件标识符与文件的连接,并利用unlink删除这个文件,如果没有close,unlink将不起作用,因为这个程序正在占用这个/tmp/file.txt,无法删除,如果要强制删除可以考虑remove函数。
所以,上述代码的运行结果如下图:

最后,这个文件自然是要被删除的了,肯定是没有的:

上述程序很简单,但我们更多应该关注这里文件标识符的作用。fd这个int就是文件标识符,相当于FILE *的作用,但他就是一个int。实质上,这个int非常独特,同open函数,int fd里面存着要被操作文件的地址,但它却又不是int *,之后的write和read函数都要根据这个fd所指明的方向来,你可以发现write,read参数都有一个地方,填入了fd,可要求填入的,却是一个int变量,这在windows里面是没有的,同时不了解文件标识符的人,看到write和read的使用可能是云里雾里的,之后的close就更不用说了,就是清楚这个fd与被操作文件的关联关系。
unlink函数则和文件标识符无关,需要一个文件路径的参数。

H. linux rm命令怎么用

linux rm命令用于删除文件,其使用步骤如下:

需要准备的材料分别是:电脑、linux连接工具。

1、首先连接上linux主机,进入命令行状态。

I. C语言unlink函数

这个提问说明了两个问题

  1. 你不会查手册,命令man 2 unlink有这个函数详细的说明

  2. 你不了解Linux的文件系统

unlink的文档是这样描述的:

unlink() deletes a name from the filesystem. If that name was the last link to a file and no processes have the file open the file is deleted and the space it was using is made available for reuse.
If the name was the last link to a file but any processes still have the file open the file will remain in existence until the last file descriptor referring to it is closed.
If the name referred to a symbolic link the link is removed.
If the name referred to a socket, fifo or device the name for it is removed but processes which have the object open may continue to use it.
首先你要明确一个概念,一个文件是否存在取决于它的inode是否存在,你在目录里看到的是目录项里一条指向该inode的链接,而不是文件的本身.

当你调用unlink的时候他直接把目录项里的该条链接删除了,但是inode并没有动,该文件还是存在的,这时候你会发现,目录里找不到该文件,但是已经打开这个文件的进程可以正常读写.只有当打开这个inode的所有文件描述符被关闭,指向该inode的链接数为0的情况下,这个文件的inode才会被真正的删除.

从unlink的名字上就应该能判断出来,unlink含义为取消链接,remove才是删除的意思

热点内容
博图脚本编辑 发布:2024-11-15 20:41:06 浏览:312
带密码的箱子钥匙在哪里 发布:2024-11-15 20:40:12 浏览:236
两个次梁相交怎么配置 发布:2024-11-15 20:27:35 浏览:373
android关机实现 发布:2024-11-15 20:26:42 浏览:56
木糠压缩原理 发布:2024-11-15 20:22:53 浏览:654
编译原理难以理解的问题 发布:2024-11-15 20:11:25 浏览:130
安卓9是什么水平 发布:2024-11-15 20:06:57 浏览:185
intel快速存储ssd 发布:2024-11-15 20:00:27 浏览:143
吃鸡配置太低怎么调高画质 发布:2024-11-15 19:58:19 浏览:735
王者怎么设置来电屏蔽安卓 发布:2024-11-15 19:56:08 浏览:450