《UNIX环境高级编程》创建临时文件

#include <stdio.h>

FILE *tmpfile(void);

tmpfile创建一个临时二进制文件(类型wb+),在关闭该文件或程序结束时将自动删除这种文件

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
	char	name[100],line[100];
	FILE	*fp;

	printf("%s\n", tmpnam(NULL));
	
	tmpnam(name);
	printf("%s\n", name);

	if((fp = tmpfile()) == NULL)
	{
		perror("tmpfile error");
	}

	fputs("one line of output\n", fp);

	rewind(fp);
	
	if(fgets(line, sizeof(line), fp) == NULL)
	{
		perror("fgets error");
	}

	fputs(line, fp);

	exit(0);
}




#include <stdlib.h>
int mkstemp(char *template);

mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。 mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非 空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证 了文件名的唯一性。 函数返回一个 文件描述符,如果执行失败返回-1。

在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。

临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完 mkstemp函数后要调用unlink函数,unlink函数 删除文件的目录入口,但临时文件还可以通过 文件描述符进行访问,直到最后一个打开的进程关 闭文件操作符,或者程序退出后临时文件被自动彻底地删除。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
	int	n;
	int	fd;
	char	line[100];
	char	temp_file[]="wyp-XXXXXX";

	if((fd = mkstemp(temp_file)) == -1)
	{
		printf("creat temp file failed\n");
		exit(1);
	}

	unlink(temp_file);
	


	if((write(fd, "hello nihao\n", 13)) == -1)
		printf("first write error\n");
	
	if(lseek(fd, 0, SEEK_SET) == -1)
		printf("lseek error\n");

	if((n = read(fd, line, sizeof(line))) < 0)
		printf("read error");

	
	if(write(STDOUT_FILENO, line, n) != n)
		printf("second write error\n");

	close(fd);

	return 0;
}



1,第二个write函数,第一个参数用stdout出错,用STDOUT_FILENO正确

2,如果不unlink的话,文件可以在当前目录下看到, 如果unlink的话,临时文件是看不到的

3,mkstemp函数推荐使用,相比较其他创建临时文件函数而言:使用tmpnam和tempnam的一个不足之处是:在返回唯一路径名和应用程序用该路径名创建文件之间有个时间窗口,在该时间窗口期间,另一个进程可能创建一个同名文件。tmpfile和mkstemp函数则不会产生此种问题,可以使用它们代替tmpnam和tempnam

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值