Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux上的自动删除文件_C_Linux - Fatal编程技术网

C linux上的自动删除文件

C linux上的自动删除文件,c,linux,C,Linux,我正在尝试在程序结束时删除一个文件。我记得在我可以将unlink()放在第一个close()之前,我不需要重新打开文件 我所期望的是:程序结束后,文件将被删除 发生的情况:当调用unlink时,文件被擦除。文件被擦除 我的示例程序: int main() { int fd = open(argv[1], O_CREAT); int x = 1; write(fd, "1234\n", 5); close(fd); fd = open(argv[1], 0

我正在尝试在程序结束时删除一个文件。我记得在我可以将
unlink()
放在第一个
close()
之前,我不需要重新打开文件

我所期望的是:程序结束后,文件将被删除

发生的情况:当调用unlink时,文件被擦除。文件被擦除

我的示例程序:

int main()
{
    int fd = open(argv[1], O_CREAT);
    int x = 1;
    write(fd, "1234\n", 5);
    close(fd);

    fd = open(argv[1], 0);
    unlink(argv[1]);

    while (x <= 3)
    {
      int k;
      scanf(" %d", &k);

      x++;
    }

    close(fd);
    return 0;
}
intmain()
{
int fd=打开(argv[1],O_CREAT);
int x=1;
写入(fd,“1234\n”,5);
关闭(fd);
fd=打开(argv[1],0);
取消链接(argv[1]);
而(x听起来你真正想要的是:

函数的作用是:打开一个唯一的二进制临时文件 读/写(w+b)模式。文件被删除时将自动删除 关闭或程序终止


断开文件链接只会将文件名从基础inode中分离,从而使以后无法使用该文件名打开文件

如果任何进程仍打开该文件,它们可以愉快地读写该文件,因为这些操作操作在inode上进行,而不是在文件名上进行。此外,如果还有硬链接(其他文件名指同一inode),则可以使用这些其他文件名来打开该文件。有关详细信息,请参阅上的Wikipedia文章


编辑以添加:

在Linux中,您可以利用
/proc
伪文件系统打开文件描述符
FD
,并且文件名已取消链接,它仍然可以让另一个应用程序在其上工作,方法是告诉另一个应用程序在
/proc/PID/FD/FD
上工作。它是一个伪文件,意味着它看起来像一个(不工作!)symlink,但它不是——它只是有用的Linux内核魔法:只要其他应用程序正常打开它(
open()
/
fopen()
等,不
lstat()
/
readlink()
之类),它们就会像打开普通文件一样获得访问权限

作为一个真实的例子,打开两个终端,一次写入

bash -c 'exec 3<>foobar ; echo $$ ; rm foobar ; echo "Initial contents" >&3 ; cat >&3'

查看该文件包含的内容。

该文件已取消链接,因此它不会在
ls
中显示……但该文件仍然存在,有一个inode,您可以实际重新链接它……在关闭指向它的所有文件描述符之前,该文件不会从磁盘中删除


您仍然可以在fd断开链接后打开时对其进行读写…

它现在不工作了
您能描述一下是如何发生的吗?发生了与您预期不同的事情吗?您是否收到错误?为什么要打开文件删除它,然后关闭它?打开文件关闭它,然后删除它不是正确的做法吗?@iharob这样做是为了更好地保证在处理文件时不会有人试图修改它……在我的情况下,它工作得很好(OSX),我不明白为什么它不能在您的平台上工作。请详细描述您的问题…很抱歉,我需要知道文件的名称。是否可以通过open/fopen模拟它?是的,但我考虑的事实是错误的,文件在我关闭之前消失。如果它消失,其他程序无法在不知道inod的情况下打开它e、 @RicardoLucca:告诉另一个进程使用
/proc/PID/fd/fd
,其中
PID
是原始进程的PID,
fd
是原始进程中的文件描述符。有关详细信息,请参阅我编辑的答案。
cat /proc/PID/fd/3