unlink
unlink(删除文件)
相关函数 link,rename,remove
表头文件 #include<unistd.h>
定义函数 int unlink(const char * pathname);
函数说明 unlink()会删除参数pathname指定的文件。如果该文件名为最后连接点,但有其他进程打开了此文件,则在所有关于此文件的文件描述词皆关闭后才会删除。如果参数pathname为一符号连接,则此连接会被删除。
返回值 成功则返回0,失败返回-1,错误原因存于errno
错误代码 EROFS 文件存在于只读文件系统内
EFAULT 参数pathname指针超出可存取内存空间
ENAMETOOLONG 参数pathname太长
ENOMEM 核心内存不足
ELOOP 参数pathname 有过多符号连接问题
EIO I/O 存取错误
#include
#include
int main(void)
{
FILE *fp = fopen("junk.jnk","w");
int status;
fprintf(fp,"junk");
status = access("junk.jnk",0);
if (status == 0)
printf("File exists/n");
else
printf("File doesn't exist/n");
fclose(fp);
unlink("junk.jnk");
status = access("junk.jnk",0);
if (status == 0)
printf("File exists/n");
else
printf("File doesn't exist/n");
return 0;
}
相关函数 link,rename,remove
表头文件 #include<unistd.h>
定义函数 int unlink(const char * pathname);
函数说明 unlink()会删除参数pathname指定的文件。如果该文件名为最后连接点,但有其他进程打开了此文件,则在所有关于此文件的文件描述词皆关闭后才会删除。如果参数pathname为一符号连接,则此连接会被删除。
返回值 成功则返回0,失败返回-1,错误原因存于errno
错误代码 EROFS 文件存在于只读文件系统内
EFAULT 参数pathname指针超出可存取内存空间
ENAMETOOLONG 参数pathname太长
ENOMEM 核心内存不足
ELOOP 参数pathname 有过多符号连接问题
EIO I/O 存取错误
#include
#include
int main(void)
{
FILE *fp = fopen("junk.jnk","w");
int status;
fprintf(fp,"junk");
status = access("junk.jnk",0);
if (status == 0)
printf("File exists/n");
else
printf("File doesn't exist/n");
fclose(fp);
unlink("junk.jnk");
status = access("junk.jnk",0);
if (status == 0)
printf("File exists/n");
else
printf("File doesn't exist/n");
return 0;
}
在maemo-launcher中,进程信号处理函数组中,有下面这个函数,其中用到了unlink来清除临时文件。static void
clean_daemon(int signal)
{
if (is_parent)
{
unlink(pidfilename);
unlink(INVOKER_SOCK);
killpg(0, signal);
}
exit(0);
}
有时程序需要
存储
很大量的数据,或者在几个进程间
交换
数据,这时您可能考虑到使用临时文件。使用临时文件要考虑几个问题:
1、保证临时文件间的文件名不互助冲突。
2、保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。
所以在
linux
下有专门处理临时文件的函数
mkstemp函数
mkstemp函数将在系统中以独一无二的文件名创建一个文件并打开,而且只有当前用户才有访问这个临时文件的权限,当前用户对这个临时文件可以打开并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。函数返回一个文件描述符,如果执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666 ,glibc 2.0.7 以后的库这个文件的访问权限是0600。
当临时文件完成她的使命如果不把它清除干净把或者程序由于意外在临时文件被清除前就已经退出,临时文件所在的目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除(请参考下文中的tmpfile函数)。执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,所以临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
例程:
直接使用advanced
linux
programming的例程,只把注释翻译一下
#include
#include
/* A handle for a temporary file created with write_temp_file. In
this implementation, it’s just a file descriptor. */
/*write_temp_file是个操作临时文件的句柄,本例中只是个文件描述符*/
typedef int temp_file_handle;
/* Writes LENGTH bytes from BUFFER into a temporary file. The
temporary file is immediately unlinked. Returns a handle to the
temporary file. */
/*在这函数从BUFFER中向临时文件写入LENGTH字节数据。临时文件在刚一创建就被删除掉。函数会返回临时文件的句柄。*/
temp_file_handle write_temp_file (char* buffer, size_t length)
{
/* Create the filename and file. The XXXXXX will be replaced with
characters that make the filename unique. */
/*新建文件名和文件,文件名中的XXXXXX将被随机字符串代替,以保证文件名在系统中的唯一性*/
char temp_filename[] = “/tmp/temp_file.XXXXXX”;
int fd = mkstemp (temp_filename);
/* Unlink the file immediately, so that it will be removed when the
file descriptor is closed. */
/*文件立刻被unlink,这样只要文件描述符一关闭文件就会被自动删除*/
unlink (temp_filename);
/* Write the number of bytes to the file first. */
/*首先写入即将写入数据的长度*/
write (fd, &length, sizeof (length));
/* Now write the data itself. */
/*写入数据本身*/
write (fd, buffer, length);
/* Use the file descriptor as the handle for the temporary file. */
/*函数返回文件描述符,作为临时文件的句柄*/
return fd;
}
/* Reads the contents of a temporary file TEMP_FILE created with
write_temp_file. The return value is a newly allocated buffer of
those contents, which the caller must deallocate with free.
*LENGTH is set to the size of the contents, in bytes. The
temporary file is removed. */
/*从被write_temp_file创建的临时文件中读取数据。返回值是含有文件内容的新申请到的内存块,这块内存应该又调用read_temp_file者释放。
*length是临时文件正文内容的长度。执行完read_temp_file函数后临时文件被彻底删除*/
char* read_temp_file (temp_file_handle temp_file, size_t* length)
{
char* buffer;
/* The TEMP_FILE handle is a file descriptor to the temporary file. */
/*fd是访问临时文件的文件描述符*/
int fd = temp_file;
/* Rewind to the beginning of the file. */
/*把文件指针指向文件开头*/
lseek (fd, 0, SEEK_SET);
/* Read the size of the data in the temporary file. */
/*获得临时文件正文长度*/
read (fd, length, sizeof (*length));
/* Allocate a buffer and read the data. */
/*分配内存块,读取数据*/
buffer = (char*) malloc (*length);
read (fd, buffer, *length);
/* Close the file descriptor, which will cause the temporary file to
go away. */
/*关闭文件描述符,临时文件被彻底删除*/
close (fd);
return buffer;
}
tmpfile函数
如果您使用C library I/O函数,并且并没有另一个程序使用这个临时文件(笔者注:按我的理解是在同一进程或具有父子关系的进程组中),有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink了这个临时文件。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。
linux系统中还提供mktemp、 tmpnam、 和tempnam等函数,但是由于健壮性和
安全
方面理由不建议使用他们。
clean_daemon(int signal)
{
if (is_parent)
{
unlink(pidfilename);
unlink(INVOKER_SOCK);
killpg(0, signal);
}
exit(0);
}
有时程序需要
存储
很大量的数据,或者在几个进程间
交换
数据,这时您可能考虑到使用临时文件。使用临时文件要考虑几个问题:
1、保证临时文件间的文件名不互助冲突。
2、保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。
所以在
linux
下有专门处理临时文件的函数
mkstemp函数
mkstemp函数将在系统中以独一无二的文件名创建一个文件并打开,而且只有当前用户才有访问这个临时文件的权限,当前用户对这个临时文件可以打开并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。函数返回一个文件描述符,如果执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666 ,glibc 2.0.7 以后的库这个文件的访问权限是0600。
当临时文件完成她的使命如果不把它清除干净把或者程序由于意外在临时文件被清除前就已经退出,临时文件所在的目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除(请参考下文中的tmpfile函数)。执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,所以临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
例程:
直接使用advanced
linux
programming的例程,只把注释翻译一下
#include
#include
/* A handle for a temporary file created with write_temp_file. In
this implementation, it’s just a file descriptor. */
/*write_temp_file是个操作临时文件的句柄,本例中只是个文件描述符*/
typedef int temp_file_handle;
/* Writes LENGTH bytes from BUFFER into a temporary file. The
temporary file is immediately unlinked. Returns a handle to the
temporary file. */
/*在这函数从BUFFER中向临时文件写入LENGTH字节数据。临时文件在刚一创建就被删除掉。函数会返回临时文件的句柄。*/
temp_file_handle write_temp_file (char* buffer, size_t length)
{
/* Create the filename and file. The XXXXXX will be replaced with
characters that make the filename unique. */
/*新建文件名和文件,文件名中的XXXXXX将被随机字符串代替,以保证文件名在系统中的唯一性*/
char temp_filename[] = “/tmp/temp_file.XXXXXX”;
int fd = mkstemp (temp_filename);
/* Unlink the file immediately, so that it will be removed when the
file descriptor is closed. */
/*文件立刻被unlink,这样只要文件描述符一关闭文件就会被自动删除*/
unlink (temp_filename);
/* Write the number of bytes to the file first. */
/*首先写入即将写入数据的长度*/
write (fd, &length, sizeof (length));
/* Now write the data itself. */
/*写入数据本身*/
write (fd, buffer, length);
/* Use the file descriptor as the handle for the temporary file. */
/*函数返回文件描述符,作为临时文件的句柄*/
return fd;
}
/* Reads the contents of a temporary file TEMP_FILE created with
write_temp_file. The return value is a newly allocated buffer of
those contents, which the caller must deallocate with free.
*LENGTH is set to the size of the contents, in bytes. The
temporary file is removed. */
/*从被write_temp_file创建的临时文件中读取数据。返回值是含有文件内容的新申请到的内存块,这块内存应该又调用read_temp_file者释放。
*length是临时文件正文内容的长度。执行完read_temp_file函数后临时文件被彻底删除*/
char* read_temp_file (temp_file_handle temp_file, size_t* length)
{
char* buffer;
/* The TEMP_FILE handle is a file descriptor to the temporary file. */
/*fd是访问临时文件的文件描述符*/
int fd = temp_file;
/* Rewind to the beginning of the file. */
/*把文件指针指向文件开头*/
lseek (fd, 0, SEEK_SET);
/* Read the size of the data in the temporary file. */
/*获得临时文件正文长度*/
read (fd, length, sizeof (*length));
/* Allocate a buffer and read the data. */
/*分配内存块,读取数据*/
buffer = (char*) malloc (*length);
read (fd, buffer, *length);
/* Close the file descriptor, which will cause the temporary file to
go away. */
/*关闭文件描述符,临时文件被彻底删除*/
close (fd);
return buffer;
}
tmpfile函数
如果您使用C library I/O函数,并且并没有另一个程序使用这个临时文件(笔者注:按我的理解是在同一进程或具有父子关系的进程组中),有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink了这个临时文件。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。
linux系统中还提供mktemp、 tmpnam、 和tempnam等函数,但是由于健壮性和
安全
方面理由不建议使用他们。