user-0 提问: remove（）函数的相关问题

回复:
user: user-1
content: 引用 2 楼 cc_innocent 的回复:楼上的dalao我还是不懂，什么叫 删除的名称是文件的最后一个链接。 还有  打开的是文档吧 ，没有打开要删除的文件 。为什么还是要fclose才能删  进程占用了啊

user: user-2
content: 引用 2 楼 cc_innocent 的回复:楼上的dalao我还是不懂，什么叫 删除的名称是文件的最后一个链接。 还有  打开的是文档吧 ，没有打开要删除的文件 。为什么还是要fclose才能删  Linux系统中,文件存在硬链接.一个文件实际的数据块可以对应多个文件名. 请看Linux link DESCRIPTION        link() creates a new link (also known as a hard link) to an existing file.         If newpath exists it will not be overwritten.         This new name may be used exactly as the old one for any operation; both names        refer to the same file (and so have the same permissions and ownership) and it        is impossible to tell which name was the "original".  link man document      chunli@Linux:~$ man 2 link LINK(2)                       Linux Programmer's Manual                       LINK(2)    NAME        link - make a new name for a file  SYNOPSIS        #include <unistd.h>         int link(const char *oldpath, const char *newpath);  DESCRIPTION        link() creates a new link (also known as a hard link) to an existing file.         If newpath exists it will not be overwritten.         This new name may be used exactly as the old one for any operation; both names        refer to the same file (and so have the same permissions and ownership) and it        is impossible to tell which name was the "original".  RETURN VALUE        On  success,  zero  is  returned.   On error, -1 is returned, and errno is set        appropriately.  ERRORS        EACCES Write access to the directory containing newpath is denied,  or  search               permission  is  denied for one of the directories in the path prefix of               oldpath or newpath.  (See also path_resolution(7).)         EDQUOT The user's quota of disk blocks on the filesystem has been exhausted.         EEXIST newpath already exists.         EFAULT oldpath or newpath points outside your accessible address space.         EIO    An I/O error occurred.         ELOOP  Too many symbolic links were encountered in resolving oldpath  or  new‐               path.         EMLINK The file referred to by oldpath already has the maximum number of links               to it.         ENAMETOOLONG               oldpath or newpath was too long.         ENOENT A directory component in oldpath or newpath does not exist or is a dan‐               gling symbolic link.         ENOMEM Insufficient kernel memory was available.         ENOSPC The device containing the file has no room for the new directory entry.         ENOTDIR               A  component used as a directory in oldpath or newpath is not, in fact,               a directory.         EPERM  oldpath is a directory.         EPERM  The filesystem containing oldpath and newpath does not support the cre‐               ation of hard links.         EPERM (since Linux 3.6)               The  caller does not have permission to create a hard link to this file               (see the description of /proc/sys/fs/protected_hardlink in proc(5)).         EROFS  The file is on a read-only filesystem.         EXDEV  oldpath and newpath are not on the  same  mounted  filesystem.   (Linux               permits  a filesystem to be mounted at multiple points, but link() does               not work across different mount points, even if the same filesystem  is               mounted on both.)  CONFORMING TO        SVr4, 4.3BSD, POSIX.1-2001 (but see NOTES).  NOTES        Hard  links, as created by link(), cannot span filesystems.  Use symlink(2) if        this is required.         POSIX.1-2001 says that link() should dereference oldpath if it is  a  symbolic        link.   However,  since kernel 2.0, Linux does not do so: if oldpath is a sym‐        bolic link, then newpath is created as a (hard) link to the same symbolic link        file  (i.e.,  newpath  becomes  a  symbolic link to the same file that oldpath        refers to).  Some other implementations behave in the same  manner  as  Linux.        POSIX.1-2008  changes  the  specification of link(), making it implementation-        dependent whether or not oldpath is dereferenced if it  is  a  symbolic  link.        For precise control over the treatment of symbolic links when creating a link,        see linkat(2).  BUGS        On NFS filesystems, the return code may be wrong in case the NFS  server  per‐        forms  the  link  creation and dies before it can say so.  Use stat(2) to find        out if the link got created.  SEE ALSO        ln(1),  linkat(2),  open(2),  rename(2),   stat(2),   symlink(2),   unlink(2),        path_resolution(7), symlink(7)  COLOPHON        This  page is part of release 3.54 of the Linux man-pages project.  A descrip‐        tion of the project, and information about reporting bugs,  can  be  found  at        http://www.kernel.org/doc/man-pages/.    Linux                                 2013-01-27                              LINK(2) chunli@Linux:~$

user: user-0
content: 楼上的dalao我还是不懂，什么叫 删除的名称是文件的最后一个链接。 还有  打开的是文档吧 ，没有打开要删除的文件 。为什么还是要fclose才能删

user: user-2
content: 来自Linux man文档: 主要看这句话:        If  the removed 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.  附上全部内容 chunli@Linux:~$ man 3 remove  REMOVE(3)                                   Linux Programmer's Manual                                  REMOVE(3)    NAME        remove - remove a file or directory  SYNOPSIS        #include <stdio.h>         int remove(const char *pathname);  DESCRIPTION        remove() deletes a name from the filesystem.  It calls unlink(2) for files, and rmdir(2) for directories.         If  the removed 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 is removed, but processes which have the        object open may continue to use it.  RETURN VALUE        On success, zero is returned.  On error, -1 is returned, and errno is set appropriately.  ERRORS        The errors that occur are those for unlink(2) and rmdir(2).  CONFORMING TO        C89, C99, 4.3BSD, POSIX.1-2001.  NOTES        Under libc4 and libc5, remove() was an alias for unlink(2) (and hence would not remove directories).  BUGS        Infelicities in the protocol underlying NFS can cause the unexpected disappearance  of  files  which  are        still being used.  SEE ALSO        rm(1), unlink(1), link(2), mknod(2), open(2), rename(2), rmdir(2), unlink(2), mkfifo(3), symlink(7)  COLOPHON        This  page  is  part  of  release 3.54 of the Linux man-pages project.  A description of the project, and        information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/.    GNU                                                2008-12-03                                          REMOVE(3) chunli@Linux:~$