5. Linux C 输入输出与文件
LINUX输入输出与文件
1.基于文件指针的文件操作(缓冲)
先来介绍 6 个概念:
① linux的文件和文件描述符
linux中对目录和设备的操作都是文件操作,文件分为普通文件,目录文件,链接文件和设备文件。
② 普通文件:也称磁盘文件,并且能够进行随机的数据存储(能够自由seek定位到某一个位置);
③ 管道:是一个从一端发送数据,另一端接收数据的数据通道;
④ 目录:也称为目录文件,它包含了保存在目录中文件列表的简单文件。
④ 设备:该类型的文件提供了大多数物理设备的接口。它又分为两种类型:
字符型设备和块设备。字符型设备一次只能读出和写入一个字节的数据,包括调制解调器、终端、打印机、声卡以及鼠标;块设备必须以一定大小的块来读出或者写入数据,块设备包括CD-ROM、RAM驱动器和磁盘驱动器等,一般而言,字符设备用于传输数据,块设备用于存储数据。
⑤ 链接:类似于Windows的快捷方式和Linux里的别名,指包含到达另一个文件路径的文件。
⑥ 套接字: 在Linux中,套接字也可以当作文件来进行处理。
基于文件指针的文件操作函数是ANSI标准函数库的一部分。
1.1.文件的创建,打开与关闭
原型为:
#include <stdio.h> //头文件包含
FILE *fopen(const char *pach,const char *mode); //文件名 模式
int fclose(FILE *stream);
- fopen 以 mode 的方式打开或创建文件,如果成功,将返回一个文件指针,失败则返回NULL.
fopen创建的文件的访问权限将以0666与当前的umask结合来确定。 - mode的可选模式列表
模式 | 读 | 写 | 位置 | 截断原内容 | 创建 |
---|---|---|---|---|---|
rb | Y | N | 文件头 | N | N |
r+b | Y | Y | 文件头 | N | N |
wb | N | Y | 文件头 | Y | Y |
w+b | Y | Y | 文件头 | Y | Y |
ab | N | Y | 文件尾 | N | Y |
a+b | Y | Y | 文件尾 | N | Y |
在Linux系统中,mode里面的’b’(二进制)可以去掉,但是为了保持与其他系统的兼容性,建议不要去掉。ab和a+b为追加模式,在此两种模式下,无论文件读写点定位到何处,在写数据时都将是在文件末尾添加,所以比较适合于多进程写同一个文件的情况下保证数据的完整性。
1.2.读写文件
基于文件指针的数据读写函数较多,可分为如下几组:
数据块读写:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
-
fread从文件流stream 中读取nmemb个元素,写到ptr指向的内存中,每个元素的大小为size个字节。
-
fwrite从ptr指向的内存中读取nmemb个元素,写到文件流stream中,每个元素size个字节。
-
所有的文件读写函数都从文件的当前读写点开始读写,读写完以后,当前读写点自动往后移动size*nmemb个字节。
整块copy,速度较快,但是是二进制操作
格式化读写:
#include <stdio.h>
int printf(const char *format, ...); //相当于fprintf(stdout,format,…);
int scanf(const char *format, …);
int fprintf(FILE *stream, const char *format, ...); 重点
int fscanf(FILE *stream, const char *format, …);
int sprintf(char *str, const char *format, ...); // eg: sprintf(buf,”the string is;%s”,str); 重点
int sscanf(char *str, const char *format, …); 重点
- 以f开头的将格式化后的字符串写入到文件流stream中
- 以s开头的将格式化后的字符串写入到字符串str中
单个字符读写:
使用下列函数可以一次读写一个字符
#include <stdio.h>
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
int getc(FILE *stream); 等同于 fgetc(FILE* stream)
int putc(int c, FILE *stream); 等同于 fputc(int c, FILE* stream)
int getchar(void); 等同于 fgetc(stdin);
int putchar(int c); 等同于 fputc(int c, stdout);
getchar和putchar从标准输入输出流中读写数据,其他函数从文件流stream中读写数据。
字符串读写:
char *fgets(char *s, int size, FILE *stream);
int fputs(const char *s, FILE *stream);
int puts(const char *s); 等同于 fputs(const char *s,stdout);
char *gets(char *s); 等同于 fgets(const char *s, int size, stdin);
fgets和fputs从文件流stream中读写一行数据;
puts和gets从标准输入输出流中读写一行数据。
fgets可以指定目标缓冲区的大小,所以相对于gets安全,但是fgets调用时,如果文件中当前行的字符个数大于size,则下一次fgets调用时,将继续读取该行剩下的字符,fgets读取一行字符时,保留行尾的换行符。
fputs不会在行尾自动添加换行符,但是puts会在标准输出流中自动添加一换行符。
文件定位:
文件定位指读取或设置文件当前读写点,所有的通过文件指针读写数据的函数,都是从文件的当前读写点读写数据的。
常用的函数有:
#include <stdio.h>
int feof(FILE * stream); //通常的用法为while(!feof(fp))
int fseek(FILE *stream, long offset, int whence);//设置当前读写点到偏移whence 长度为offset处
long ftell(FILE *stream); //用来获得文件流当前的读写位置
void rewind(FILE *stream); //把文件流的读写位置移至文件开头 fseek(fp, 0, SEEK_SET);
feof判断是否到达文件末尾的下一个(注意到达文件末尾之后还会做一次)
fseek设置当前读写点到偏移whence 长度为offset处,whence可以是:
SEEK_SET (文件开头 0)
SEEK_CUR (文件当前位置 1)
SEEK_END (文件末尾 2)
ftell获取当前的读写点
rewind将文件当前读写点移动到文件头
注:基于文件指针的文件操作请参考《C语言文件操作常用函数详解.doc》
1.3.目录操作
改变目录或文件的访问权限
#include <sys/stat.h>
int chmod(const char* path, mode_t mode); //mode形如:0777
path参数指定的文件被修改为具有mode参数给出的访问权限。
获取、改变当前目录:
原型为:
#include <unistd.h> //头文件
char *getcwd(char *buf, size_t size); //获取当前目录,相当于pwd命令
int chdir(const char *path); //修改当前目录,即切换目录,相当于cd命令
-
getcwd()函数:将当前的工作目录绝对路径复制到参数buf所指的内存空间,参数size为buf的空间大小. 在调用此函数时,buf所指的内存空间要足够大,若工作目录绝对路径的字符串长度超过参数size大小,则回值NULL,errno的值则为ERANGE。
倘若参数buf为NULL,getcwd()会依参数size的大小自动配置内存(使用malloc()),如果参数size也为0,则getcwd()会依工作目录绝对路径的字符串程度来决定所配置的内存大小,进程可以在使用完此字符串后自动利用free()来释放此空间。所以常用的形式:getcwd(NULL, 0); -
chdir()函数:用来将当前的工作目录改变成以参数path所指的目录
-
Example:
#include<unistd.h>
main()
{chdir(“/tmp”);printf(“current working directory: %s\n”,getcwd(NULL,0));
}
创建和删除目录:
原型为:
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int mkdir(const char *pathname, mode_t mode); //创建目录,mode是目录权限,没用
int rmdir(const char *pathname); //删除目录
获取目录信息:
原型为:
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name); //打开一个目录
struct dirent *readdir(DIR *dir); //读取目录的一项信息,并返回该项信息的结构体指针
void rewinddir(DIR *dir); //重新定位到目录文件的头部
void seekdir(DIR *dir,off_t offset);//用来设置目录流目前的读取位置
off_t telldir(DIR *dir); //返回目录流当前的读取位置
int closedir(DIR *dir); //关闭目录文件#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>
int stat(const char *pathname, struct stat *buf); 获取文件状态
读取目录信息的步骤为:
-
用opendir函数打开目录;
-
使用readdir函数迭代读取目录的内容,如果已经读取到目录末尾,又想重新开始读,则可以使用rewinddir函数将文件指针重新定位到目录文件的起始位置;
-
用closedir函数关闭目录
-
opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和文件操作函数open()类似,接下来对目录的读取和搜索都要使用此返回值。函数失败则返回NULL;
-
readdir()函数用来读取目录的信息,并返回一个结构体指针,该指针保存了目录的相关信息。有错误发生或者读取到目录文件尾则返回NULL;
-
dirent结构体如下:
struct dirent
{ino_t d_ino; /* inode number(此目录进入点的inode) */off_t d_off; /* offset to the next dirent(目录开头到进入点的位移 */unsigned short d_reclen; /* length of this record(目录名的长度) */unsigned char d_type; /* type of file(所指的文件类型) */char d_name[256]; /* filename(文件名) */
};
-
seekdir()函数用来设置目录流目前的读取位置,再调用readdir()函数时,便可以从此新位置开始读取。参数offset代表距离目录文件开头的偏移量。
-
telldir()函数用来返回目录流当前的读取位置。
-
结构体stat的定义为:
struct stat {dev_t st_dev; /*如果是设备,返回设备表述符,否则为0*/ino_t st_ino; /* i节点号 */mode_t st_mode; /* 文件类型 */nlink_t st_nlink; /* 链接数 */uid_t st_uid; /* 属主ID */gid_t st_gid; /* 组ID */dev_t st_rdev; /* 设备类型*/off_t st_size; /* 文件大小,字节表示 */blksize_t st_blksize; /* 块大小*/blkcnt_t st_blocks; /* 块数 */time_t st_atime; /* 最后访问时间*/time_t st_mtime; /* 最后修改时间*/time_t st_ctime; /* 最后权限修改时间 */
};
time_t的结构,在头文件 /usr/include/linux/time.h
st_mtim
struct timespec {__kernel_time_t tv_sec; /* seconds */long tv_nsec; /* nanoseconds */
};
__kernel_time_t是long类型的
- 示例:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>int main(int argc,char *argv[])
{struct dirent *pDirInfo;DIR *pDir;if(argc < 2)pDir = opendir(".");elsepDir = opendir(argv[1]);
if(NULL == pDir)
{perror("open dir fail!");return -1;}while( (pDirInfo = readdir(pDir)) != NULL )printf("%s\n",pDirInfo->d_name);closedir(pDir);return 0;}
- Example:以树形结构的形式输出指定目录下面的所有文件
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <stdlib.h>
void printdir(char *dir, int depth)
{DIR *dp = opendir(dir);
if(NULL == dp)
{fprintf(stderr,"cannot open directory: %s\n", dir);return;}
chdir(dir);struct dirent *entry;struct stat statbuf;
while((entry = readdir(dp)) != NULL)
{stat(entry->d_name,&statbuf);if(S_ISDIR(statbuf.st_mode))
{if(strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0)continue;printf("%*s%s/\n",depth,"",entry->d_name);printdir(entry->d_name,depth+4);}else
printf("%*s%s\n",depth,"",entry->d_name);
//printf(“%*s”,4,”*”); 该函数表示输出“___*”,前面输出3个空格。
//如果是printf(“%*s”,4,“**”);则表示输出“__**”,前面输出2个空格。}chdir("..");closedir(dp);
}int main(int argc, char* argv[])
{char *topdir, pwd[2]=".";if (argc < 2)topdir=pwd;elsetopdir=argv[1];printf("Directory scan of %s\n",topdir);printdir(topdir,0);printf("done.\n");exit(0);
}
1.4.标准输入/输出流
在进程一开始运行,就自动打开了三个对应设备的文件,它们是标准输入、输出、错误流,分别用全局文件指针stdin、stdout、stderr表示,stdin具有可读属性,缺省情况下是指从键盘的读取输入,stdout和stderr具有可写属性,缺省情况下是指向屏幕输出数据。
- 示例:
#include <stdio.h>
#include <unistd.h>
int main()
{char szBuf[32];printf("Input string:"); //向屏幕输出一字符串fgets(szBuf,sizeof(szBuf),stdin);//从键盘读入一行字符串fprintf(stdout,"The string is:%s",szBuf);//向屏幕输出一行字符串return 0;
}
2.基于文件描述符的文件操作(非缓冲)
2.1.文件描述符
-
内核为每个进程维护一个已打开文件的记录表,文件描述符是一个较小的正整数(0—1023),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读、写、创建、删除等操作。
-
常用基于文件描述符的函数有open(打开)、creat(创建)、close(关闭)、read(读取)、write(写入)、ftruncate(改变文件大小)、lseek(定位)、fsync(同步)、fstat(获取文件状态)、fchmod(权限)、flock(加锁)、fcntl(控制文件属性)、dup(复制)、dup2、select和ioctl。基于文件描述符的文件操作并非ANSI C的函数。
-
如果不清楚某个函数的具体实现形式,可以通过下面的方式查询
man 函数名
查看该函数的帮助。
2.2.打开、创建和关闭文件
- open和creat都能打开和创建函数,原型为
#include <sys/types.h> //头文件
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags); //文件名 打开方式
int open(const char *pathname, int flags, mode_t mode);//文件名 打开方式 权限
int creat(const char *pathname, mode_t mode); //文件名 权限 //现在已经不常用了
creat函数等价于open(pathname,O_CREAT|O_TRUNC|O_WRONLY,mode);
open()函数出错时返回-1,相关参数如下:
flags和mode都是一组掩码的合成值,flags表示打开或创建的方式,mode表示文件的访问权限。
flags的可选项有
-
掩码 含义
O_RDONLY 以只读的方式打开
O_WRONLY 以只写的方式打开
O_RDWR 以读写的方式打开
O_CREAT 如果文件不存在,则创建文件
O_EXCL 仅与O_CREAT连用,如果文件已存在,则强制open失败
O_TRUNC 如果文件存在,将文件的长度截至0
O_APPEND 已追加的方式打开文件,每次调用write时,文件指针自动先移到文件尾,用于多进程写同一个文件的情况。
O_NONBLOCK 非阻塞方式打开,无论有无数据读取或等待,都会立即返回进程之中。
O_NODELAY 非阻塞方式打开
O_SYNC 同步打开文件,只有在数据被真正写入物理设备设备后才返回 -
mode的可选项有:
S_IRWXU 00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
S_IRUSR 或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。
S_IWUSR 或S_IWRITE,00200 权限,代表该文件所有者具有可写入的权限。
S_IXUSR 或S_IEXEC,00100 权限,代表该文件所有者具有可执行的权限。
S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
S_IROTH 00004 权限,代表其他用户具有可读的权限
S_IWOTH 00002权限,代表其他用户具有可写入的权限。
S_IXOTH 00001 权限,代表其他用户具有可执行的权限。 -
但是通常采用直接赋数值的形式,如:
int fd = open(“1.txt”,O_WRONLY | O_CREAT,0755); //表示给755的权限
if(-1 == fd)
{perror("open failed!\n");exit(-1);
}
注意:LINUX中基于文件描述符的open函数,对于一个不存在的文件,不能通过O_WRONLY的方式打开,必须加上O_CREAT选项。
close用于文件的关闭:
int close(int fd);//fd表示文件描述词,是先前由open或creat创建文件时的返回值。
文件使用完毕后,应该调用close关闭它,一旦调用close,则该进程对文件所加的锁全都被释放,并且使文件的打开引用计数减1,只有文件的打开引用计数变为0以后,文件才会被真正的关闭。
2.3.读写文件
读写文件的函数原型为:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);//文件描述词 缓冲区 长度
ssize_t write(int fd, const void *buf, size_t count);
对于read和write函数,出错返回-1,读取完了之后,返回0, 其他情况返回读写的个数。
Example:将aaa.txt中的内容复制到bbb.txt中,其中bbb.txt起初不存在。
#include <stdio.h>
#include <stdlib.h> //包含exit
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h> //用perror输出错误
#include <unistd.h>
#define FILENAME1 "./aaa.txt" //用宏定义文件的路径,可以实现一改都改
#define FILENAME2 "./bbb.txt"
main()
{char buf[512] = {0};int fo1 = open(FILENAME1, O_RDONLY);//fo1,fo2都是文件描述词int fo2 = creat(FILENAME2, 0755); //创建文件//int fo2 = open(FILENAME2, O_WRONLY | O_CREAT);if( (-1 == fo1) || (-1 == fo2) )
{perror("open failed!\n");//用于输出错误信息.类似于:fputs(”open failed\n”,stderr);exit(-1);}int fr = 0;while( (fr = read(fo1, buf, sizeof(buf))) > 0 )//如果read读取成功,返回的是长度,否则,返回-1{int fw = write(fo2, buf, fr);if( -1 == fw ){perror("write failed!");exit(-1);}}close(fo1);close(fo2);
}
2.4.改变文件大小
函数原型:
#include <unistd.h>
int ftruncate(int fd, off_t length);
函数ftruncate会将参数fd指定的文件大小改为参数length指定的大小。参数fd为已打开的文件描述词,而且必须是以写入模式打开的文件。如果原来的文件大小比参数length大,则超过的部分会被删去。
返回值 执行成功则返回0,失败返回-1。
实例:
int main()
{int fd = open("a.txt", O_WRONLY);ftruncate(fd, 1000);close(fd);return 0;
}
2.5.文件定位
函数lseek将文件指针设定到相对于whence,偏移值为offset的位置
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);//fd文件描述词
- whence 可以是下面三个常量的一个
SEEK_SET 从文件头开始计算
SEEK_CUR 从当前指针开始计算
SEEK_END 从文件尾开始计算
利用该函数可以实现文件空洞(对一个新建的空文件,可以定位到偏移文件开头1024个字节的地方,在写入一个字符,则相当于给该文件分配了1025个字节的空间,形成文件空洞)通常用于多进程间通信的时候的共享内存。
int main()
{int fd = open("c.txt", O_WRONLY | O_CREAT);lseek(fd, 1024, SEEK_SET);write(fd, "a", 1);close(fd);return 0;
}
2.6.获取文件信息
可以通过fstat和stat函数获取文件信息,调用完毕后,文件信息被填充到结构体struct stat变量中,函数原型为:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int stat(const char *file_name, struct stat *buf); //文件名 stat结构体指针
int fstat(int fd, struct stat *buf); //文件描述词 stat结构体指针结构体stat的定义为:
struct stat {dev_t st_dev; /*如果是设备,返回设备表述符,否则为0*/ino_t st_ino; /* i节点号 */mode_t st_mode; /* 文件类型 */nlink_t st_nlink; /* 链接数 */uid_t st_uid; /* 属主ID */gid_t st_gid; /* 组ID */dev_t st_rdev; /* 设备类型*/off_t st_size; /* 文件大小,字节表示 */blksize_t st_blksize; /* 块大小*/blkcnt_t st_blocks; /* 块数 */time_t st_atime; /* 最后访问时间*/time_t st_mtime; /* 最后修改时间*/time_t st_ctime; /* 最后权限修改时间 */
};
- 对于结构体的成员st_mode,有一组宏可以进行文件类型的判断
宏 描述
S_ISLNK(mode) 判断是否是符号链接
S_ISREG(mode) 判断是否是普通文件
S_ISDIR(mode) 判断是否是目录
S_ISCHR(mode) 判断是否是字符型设备
S_ISBLK(mode) 判断是否是块设备
S_ISFIFO(mode) 判断是否是命名管道
S_ISSOCK(mode) 判断是否是套接字
通常用于判断:if(S_ISDIR(st.st_mode)){} - Example:获得文件的大小
#include<sys/stat.h>
#include<unistd.h>
main()
{
struct stat buf;
stat (“/etc/passwd”,&buf);
printf(“/etc/passwd file size = %d \n”,buf.st_size);//st_size可以得到文件大小
}
如果用fstat函数实现,如下:
int fd = open (“/etc/passwd”,O_RDONLY); //先获得文件描述词
fstat(fd, &buf);
实例:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>int main()
{int fd = open("/home/wangxiao/0926/a.txt", O_RDONLY);if(fd == -1){perror("open error");exit(-1);}struct stat buf;int iRet = fstat(fd, &buf);if(iRet == -1){perror("fstat error");exit(-1);}if(S_ISREG(buf.st_mode)){printf("regular file!\n");}if(S_ISDIR(buf.st_mode)){printf("directory!\n");}if(S_ISLNK(buf.st_mode)){printf("link file!\n");}printf("the size of file is : %d\n", buf.st_size);time_t tt = buf.st_atime;struct tm *pT = gmtime(&tt);printf("%4d-%02d-%02d %02d:%02d:%02d\n", (1900+pT->tm_year), (1+pT->tm_mon), pT->tm_mday, (8+pT->tm_hour), pT->tm_min, pT->tm_sec);// printf("the last access time is : %d\n", buf.st_atime);close(fd);return 0;
}
2.7.文件描述符的复制
系统调用函数dup和dup2可以实现文件描述符的复制,经常用来重定向进程的stdin(0),stdout(1),stderr(2)。
dup返回新的文件描述符(没有使用的文件描述符的最小编号)。这个新的描述符是旧文件描述符的拷贝。这意味着两个描述符共享同一个数据结构。
dup2允许调用者用一个有效描述符(oldfd)和目标描述符(newfd),函数成功返回时,目标描述符将变成旧描述符的复制品,此时两个文件描述符现在都指向同一个文件,并且是函数第一个参数(也就是oldfd)指向的文件。
原型为:
#include <unistd.h> //头文件包含
int dup(int oldfd);
int dup2(int oldfd, int newfd);
文件描述符的复制是指用另外一个文件描述符指向同一个打开的文件,它完全不同于直接给文件描述符变量赋值,例如:
描述符变量的直接赋值:
char szBuf[32];
int fd=open(“./a.txt”,O_RDONLY);
int fd2=fd; //类似于C语言的指针赋值,当释放掉一个得时候,另一个已经不能操作了
close(fd); //导致文件立即关闭
printf(“read:%d\n”,read(fd2),szBuf,sizeof(szBuf)-1); //读取失败
close(fd2); //无意义
在此情况下,两个文件描述符变量的值相同,指向同一个打开的文件,但是内核的文件打开引用计数还是为1,所以close(fd)或者close(fd2)都会导致文件立即关闭掉。
描述符的复制:
char szBuf[32];
int fd=open(“./a.txt”,O_RDONLY);
int fd2=dup(fd); //内核的文件打开引用计算+1,变成2了
close(fd); //当前还不会导致文件被关闭,此时通过fd2照样可以访问文件
printf(“read:%d\n”,read(fd2),szBuf,sizeof(szBuf)-1);
close(fd2); //内核的引用计数变为0,文件正式关闭
Example:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc,char *argv[])
{char szBuf[32]={0};int fda=open("./a.txt",O_RDWR); //假设a.txt的内容为:hello worldint fdaa=dup(fda);read(fda,szBuf,4);puts(szBuf); //关闭之前先输入原来的内容close(fda);//lseek(fdaa, 0, SEEK_SET);read(fdaa,szBuf,sizeof(szBuf));puts(szBuf); //输出现在的内容close(fdaa);
}
解析:假设a.txt中的内容为:hello world.上面的例子会发现第一次输出的结果是hell。关闭close(fda)的时候,文件实际上还没有真正的关闭,此时文件指针已经向后移动了。执行第二次read命令将o world读出来,最后关闭fdaa。
dup有时会用在一些特定的场合,如下:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
int main()
{int fd = open("a.txt", O_WRONLY | O_CREAT);if(fd == -1){perror("open error");exit(-1);}printf("\n"); /* 必不可少 */close(1);int fd2 = dup(fd);close(fd);printf("hello world\n");close(fd2);return 0;
}
该程序首先打开了一个文件,返回一个文件描述符,因为默认的就打开了0,1,2表示标准输入,标准输出,标准错误输出。而用close(1);则表示关闭标准输出,此时这个文件描述符就空着了。后面又用dup,此时dup(fd);则会复制一个文件描述符到当前未打开的最小描述符,此时这个描述符为1.后面关闭fd自身,然后在用标准输出的时候,发现标准输出重定向到你指定的文件了。那么printf所输出的内容也就直接输出到文件了。
dup2(int fdold,int fdnew)也是进行描述符的复制,只不过采用此种复制,新的描述符由用户用参数fdnew显示指定,而不是象dup一样由内核帮你选定(内核选定的是随机的)。对于dup2,如果fdnew已经指向一个已经打开的文件,内核会首先关闭掉fdnew所指向的原来的文件。此时再针对于fdnew文件描述符操作的文件,则采用的是fdold的文件描述符。如果成功dup2的返回值于fdnew相同,否则为-1.
思考下面程序的结果:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc,char *argv[])
{char szBuf[32]={0};int fda=open("./a.txt",O_RDONLY);int fdb=open("./b.txt",O_RDONLY);int fdbb=dup(fdb);int fda2=dup2(fda,fdb); //可以设定为:int fda2 = dup2(fda,5);即自己设为5printf("fda:%d fdb:%d fdbb:%d fda2:%d",fda,fdb,fdbb,fda2);read(fdb,szBuf,sizeof(szBuf)-1); //此时fdb已经不再定位b.txt而是a.txtprintf("result:%s\n",szBuf);close(fda);close(fdb);close(fdbb);close(fda2);
}
2.8.标准输入输出文件描述符
与标准的输入输出流对应,在更底层的实现是用标准输入、标准输出、标准错误文件描述符表示的。它们分别用STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO三个宏表示,值分别是0、1、2三个整型数字。
标准输入文件描述符 STDIN_FILENO 0
标准输出文件描述符 STDOUT_FILENO 1
标准错误输出文件描述符 STDERR_FILENO 2
示例:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{char szBuf[32],szBuf2[50];printf("Input string:");fflush(stdout); //要刷新标准输出流,才可以立即在屏幕上显示”Input string”//fflush用于linux中的时候,只对fflush(stdout)有效。int iRet=read(STDIN_FILENO,szBuf,sizeof(szBuf));szBuf[iRet]=0; //read是以无类型指针方式读的数据,不会自动在缓冲区后加0结束标记。sprintf(szBuf2,"The string is:%s",szBuf);write(STDOUT_FILENO,szBuf2,strlen(szBuf2));return 0;
}
2.9.I/O多路转接模型
I/O多路转接模型:在这种模型下,如果请求的I/O操作阻塞,且它不是真正阻塞I/O,而是让其中的一个函数等待,在这期间,I/O还能进行其他操作。如本节要介绍的select()函数,就是属于这种模型。
Select函数:
#include <sys/select.h>
#include <sys/time.h>
int select(int maxfd, fd_set *readset,fd_set *writeset, fd_set *exceptionset, const struct timeval * timeout);
返回:就绪描述字的正数目,0——超时,-1——出错
参数解释:
maxfd: 最大的文件描述符(其值应该为最大的文件描述符字 + 1)
readset: 内核读操作的描述符字集合
writeset:内核写操作的描述符字集合
exceptionset:内核异常操作的描述符字集合
timeout:等待描述符就绪需要多少时间。NULL代表永远等下去,一个固定值代表等待固定时间,0代表根本不等待,检查描述字之后立即返回。
其中readset、writeset、exceptionset都是fd_set集合。该集合的相关操作如下:
void FD_ZERO(fd_set fdset); / 将所有fd清零 */
void FD_SET(int fd, fd_set fdset); / 增加一个fd */
void FD_CLR(int fd, fd_set fdset); / 删除一个fd */
int FD_ISSET(int fd, fd_set fdset); / 判断一个fd是否有设置 */
一般来说,在使用select函数之前,首先要使用FD_ZERO和FD_SET来初始化文件描述符集,在使用select函数时,可循环使用FD_ISSET测试描述符集,在执行完对相关文件描述符之后,使用FD_CLR来清除描述符集。
另外,select函数中的timeout是一个struct timeval类型的指针,该结构体如下:
struct timeval
{long tv_sec; /* second */ //秒long tv_usec; /* microsecond */ //微秒
};
Example:多路转接模型 select
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define FILENAME1 "a.txt"
#define FILENAME2 "dir.c"
int main()
{char buf[10] = {0};int fd1 = open(FILENAME1,O_RDWR);int fd2 = open(FILENAME2,O_RDWR);int fd3 = open(FILENAME1,O_RDWR);int fd4 = open(FILENAME2,O_RDWR);if( (-1 == fd1) || (-1 == fd2) || (-1 == fd3) || (-1 == fd4) ){perror("open");exit(-1);}fd_set fdrd,fdwr; //绑定读写集合FD_ZERO(&fdrd); //清除以前读的绑定FD_ZERO(&fdwr); //清除以前写的绑定FD_SET(fd1,&fdrd); //将fd1与读绑定FD_SET(fd2,&fdrd);FD_SET(fd3,&fdwr); //将fd3与写绑定FD_SET(fd4,&fdwr);int max1 = fd1 > fd2 ? fd1 : fd2; //获取读绑定中的文件描述词最大值int max2 = fd3 > fd4 ? fd3 : fd4; //获取写绑定中的文件描述词最大值int max = max1 > max2 ? max1 : max2; //获得读写文件描述词最大值struct timeval tv; //用于记录时间,表示过这么长时间不响应就退出tv.tv_sec = 2; //秒tv.tv_usec = 0; //微妙while(1){if( select(max+1, &fdrd, &fdwr, NULL, &tv) == -1 ) //从1—max+1查找{perror("select");break;}if( FD_ISSET(fd1,&fdrd) ) //如果fd1设置的是读绑定{read(fd1,buf,sizeof(buf)-1);puts(buf);sleep(1);}if( FD_ISSET(fd2,&fdrd) ){read(fd2,buf,sizeof(buf)-1);puts(buf);sleep(1);}if( FD_ISSET(fd3,&fdwr) ) //如果fd3设置的是写绑定{write(fd3,buf,sizeof(buf));sleep(2);}if( FD_ISSET(fd4,&fdwr) ){write(fd4,buf,sizeof(buf));sleep(2);}} close(fd1);close(fd2);close(fd3);close(fd4);
}
样例存在问题
补充:
- 程序参数:
int main(int argc,char ** argv)
{int i = 0;for( ; i< argc; i++)printf("%s",argv[i]);
}
参数argc表示命令行传入的参数个数,并且一次保存到argv数组中。例如程序叫main.c,最后执行的时候,如果直接是./main则argc=1,此时argv[0]就是./main;如果是./main aaa bbb,则argc=3,argv[0]:./main, argv[1]:aaa argv[2]:bbb.
- 日志
许多应用程序需要记录它们的活动,系统程序经常需要向控制台或日志文件写消息。这些消息可能指示错误、警告或者与系统状态有关的一般信息。通常是在/var/log目录下的messages中包含了系统信息。通过syslog可以向系统的日志发送日志信息。
函数原型如下:
#include <syslog.h>
void syslog(int priority, const char* message, arguments…);
对于priority有如下几个常见的:
LOG_EMERG 紧急情况
LOG_ALERT 高优先级故障(如:数据库崩溃)
LOG_CRIT 严重错误(如:硬件错误)
LOG_ERR 错误
LOG_WARNING 警告
LOG_NOTICE 需要注意的特殊情况
LOG_INFO 一般信息
LOG_DEBUG 调试信息(写不到messages里面)
#include <syslog.h>
main()
{//openlog("log",LOG_PID|LOG_CONS|LOG_NOWAIT,LOG_USER);syslog(LOG_ALERT,"this is alert\n");syslog(LOG_INFO,"this is info\n");syslog(LOG_DEBUG,"this is debug%d\t %s",10,"aaaa");syslog(LOG_ERR,"err");syslog(LOG_CRIT,"crit");//closelog();
}
利用tail -10 /var/log/messages可以查看。
还可以通过函数openlog函数来改变日志信息的表达方式。openlog的原型如下:
#include <syslog.h>
void openlog(const char* ident, int logopt, int facility);
void closelog(void);
它可以设置一个字符串ident,该字符串会添加在日志信息的前面。你可以通过它来指明是哪个应用程序创建了这条信息。facility值为LOG_USER。logopt参数对后续syslog调用的行为进行配置。如下:
LOG_PID 在日志信息中包含进程标识符,这是系统分配给每个进程的一个唯一值
LOG_CONS 如果信息不能被记录到日志文件中,就把它们发送到控制台
- 日期
#include <time.h>
main()
{char *wday[] = { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday","saterday" };time_t timep;struct tm *pTm;time(&timep);pTm = gmtime(&timep);printf("%04d-%02d-%02d\t",(1900 + pTm->tm_year), (1 + pTm->tm_mon), (pTm->tm_mday));printf("%02d:%02d:%02d\t",(8 + pTm->tm_hour), (pTm->tm_min), (pTm->tm_sec)); //似乎小时总是相差8,所以加上8试试printf("%s\n",wday[pTm->tm_wday]);
}
2.10.MMAP文件映射
MMAP文件映射
向文件写内容,必须是文件有大小的。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 【】31 下一个排列
题目 难度中等528实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 思路 字典排序的原理:下一个排列意味着…...
2024/5/6 9:26:59 - 阿龙的学习笔记---《操作系统 - 精髓与设计原理》笔记---第十一章:I/O管理和磁盘调度
1. I/O设备设备的多样性导致很难找到一种统一的、一致的I/O解决办法。2. I/O功能的组织三种技术:程序控制I/O、中断控制I/O,直接存储器访问(DMA)。 I/O设备的发展趋势,逐步让中央处理器从I/O任务中解脱出来,I/O模块有了自己的处理器甚至局部存储器。称为I/O通道。 直接存储…...
2024/4/24 14:17:36 - 程序员必须掌握的Java 框架,小白学会之后15k不是问题
Spring 的核心特性是什么?Spring 优点? Spring 的核心是控制反转(IoC)和面向切面(AOP) Spring 优点:程序员必须掌握的Java 框架,学会之后50k不是问题 (1)方便解耦,简化开发 (高内聚低耦合) Spring 就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给…...
2024/4/24 14:17:35 - 软件工程之系统工程
文章链接:https://codemouse.online/archives/2020-03-06-104840 基于计算机的系统概念 通过处理信息来完成某些预定义目标而组织在一起的元素的集合或排列系统元素组成基于计算机系统的元素:软件、硬件、人员、数据库、文档、规程软件:指计算机程序、数据结构和相关的工作产品…...
2024/5/6 11:46:27 - Axure RP(二十六)案例(App内容上下拖动)
制作基本的App页面,并在屏幕中间添加一个动态面板并命名为“屏幕”。 双击动态面板进入状态1,制作首页内容,并将所有内容组合成一个整体。为动态面板增加鼠标拖动时事件,拖动时移动y轴的值。 上述示例效果当移动到顶部还能移动,当移动到底部也还能移动,这是不行的,我们需…...
2024/4/24 14:17:34 - 遇到一个IDEA2020.1.2版本BUG ERROR:(3, 32) JAVA: 程序包ORG.SPRINGFRAMEWORK.BOOT不存在
过程是这样,本来今天周末,寻思不打游戏了,搞个开源项目练练手,项目地址:http://www.macrozheng.com/#/architect/mall_arch_01 就按文档开始搭呗,十点左右开始,本地环境: JAVA10+IDEA2020.1.2 +maven3.5.5 刚开始进展的很顺利,因为之前重装过系统,装了个最新的IDEA,…...
2024/4/25 21:59:34 - 2020-06-20:一句话总结ZK?
这道题价值不大,但是面试题里有这道题。 分布式协调服务,注册服务和发现,树形结构,监听机制,过半机制。 ZooKeeper是源代码开放的分布式协调服务,由雅虎公司创建,是Google Chubby(主要解决分布式锁相关问题)的开源实现。ZooKeeper是一个高性能的分布式一致性解决方案,…...
2024/4/15 3:18:48 - Oracle数据库——PL/SQL程序设计(光标)
光标就是一个结果集(Result Set) 一、光标的语法 CURSOR 光标名 [(参数名 数据类型[, 参数名 数据类型])]IS SELECT 语句;例:cursor c1 is select ename from emp; 二、从光标中取值 1、打开光标open c1; (打开光标执行查询)2、取一行光标的值:fetch c1 into pename; (取…...
2024/5/5 16:11:14 - Origin | 自定义函数图像绘制
文章目录前言一、图像绘制二、图像调整 前言 我们常常会遇到一些函数,可利用Origin简单绘制出函数的曲线。 一、图像绘制 打开Origin软件;在上方工具栏点击绘图-函数图-新建2D函数图,此时弹出一个创建2D函数图的界面,如下动图所示:我们在弹出的界面,输入自定义函数,如输…...
2024/4/15 3:18:46 - Observe and Look Further: Achieving Consistent Performance on Atari
文章目录1. Introduction3. Algorithm3.1. DQN Background3.2. Transformed Bellman Operator3.3. Temporal consistency (TC) loss3.4. Ape-X DQfDReplay buffersActor processesLearner process 1. Introduction 作者认为,一种算法需要克服三个关键挑战,才能在所有Atari游戏…...
2024/4/15 3:18:48 - 八、jQuery的QQ音乐播放器
项目资料查看源码在线Demo基本框架及顶部布局<div class="header"><h1 class="logo"><a href="#"></a></h1><ul class="register"><li>注册</li><li>登陆</li></ul&g…...
2024/4/29 22:17:59 - 硬盘可用空间的计算方法
存储空间的规划,一些容量大小的计算如下。华为服务器RH2288H V3,做raid1的存储容量为总可用空间*(总盘数-1)/总盘数,RAID0的容量为可用空间的1/2。实际容量(G)个数RAID前(G)RAID0(T)RAID1(G)837.25986698.0723.2705429695.72345另外在厂商实际标称的容量,和实际可用的容量…...
2024/5/5 7:05:06 - 谱分析——连续傅里叶变换
傅里叶变换(连续谱) [!] 以下笔记内容可能会出现部分错误的地方,恳请各位师生批评指正,谢谢! 部分内容摘录自Wiki主要内容连续傅里叶变换 连续傅里叶变换的性质连续傅里叶变换傅里叶变换源自对傅里叶技术的研究。在对傅里叶级数的研究中,复杂的周期函数可以用一系列简单的正…...
2024/5/5 13:48:10 - mysql(十二)一图带你看懂组合索引的索引结构
在网络上有很多MySQL的索引的结构的介绍,相信你对索引的结构已经非常了解了,关于组合索引呢?组合索引是在B+树中的结构是怎么样的?怎么排序的?索引中相同的值,存储的id是什么结构?在本篇文章中就跟你一一说明 一、组合索引的图示 话不多说,直接上图上面是根据身高年龄建…...
2024/4/24 14:17:32 - 线性表链式存储——学生成绩管理系统
🎈此程序与我的《线性表顺序存储——学生成绩管理系统》实现功能一致这里不再放置程序运行截图 #include <iostream.h> #include <stdlib.h> #define NULL 0 /*学生管理系统2.0 版链式存储by 文丽 */ typedef struct LNode {int data;struct LNode * next; }Link…...
2024/4/24 14:17:31 - 腾讯云部署spring boot项目
XShell 6:用于远程连接你的服务器 XFtp 6:用于把本地文件上传至云服务器 打开xshell6,连接到服务器: 输入命令:选择自己的操作系统版本的命令,回车执行 Centos安装命令: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.s…...
2024/5/5 10:10:30 - 看了Java的Class类之后,我自闭了
java源码之Class 源码的重要性不言而喻,虽然枯燥,但是也有拍案叫绝。这是我的源码系列第二弹,后续还会一直更新,欢迎交流。String源码可以看我的Java源码之String,如有不足,希望指正。 1.class这个类是什么 Class的本质也是一个类,只不过它是将我们定义类的共同…...
2024/5/5 4:23:50 - 微信公众号开发之:实现微信扫一扫
公众号配置 登录微信公众平台进入–>“公众号设置”–>“功能设置”–>填写“JS接口安全域名”,具体进入官网查看与配置。 引入js文件 <script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>通过jssdk配置接口注入权限验证配…...
2024/4/24 8:08:36 - C++实现大数加减法
目录一、实验目的二、实验环境三、实验过程3.1 大数加法3.2 大数减法 一、实验目的 使用C++实现大数的加减 二、实验环境 GCC 4.9.2 三、实验过程 3.1 大数加法 例1: 无进位情况 string a = “12345” , string b = “789” 利用数组逆序存储两个数字,来求和与进位 图示:求和结…...
2024/5/5 12:22:27 - vim实用插件备忘
1、插件管理 (Vundle)1.1 插件安装git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 1.2、.vimrc 插件配置set nocompatible " 去除VI一致性,必须 filetype off " 必须" 设置包括 vundle 和初…...
2024/5/5 15:23:00
最新文章
- 跟TED演讲学英文:Is your partner “the one?“ Wrong question by George Blair-West
Is your partner “the one?” Wrong question Link: https://www.ted.com/talks/george_blair_west_is_your_partner_the_one_wrong_question Speaker: George Blair-West Date: December 2022 文章目录 Is your partner "the one?" Wrong questionIntroduction…...
2024/5/6 15:04:45 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/6 9:38:23 - 【stm32】I2C通信协议
【stm32】I2C通信协议 概念及原理 如果我们想要读写寄存器来控制硬件电路,就至少需要定义两个字节数据 一个字节是我们要读写哪个寄存器,也就是指定寄存器的地址 另一个字节就是这个地址下存储寄存器的内容 写入内容就是控制电路,读出内容就…...
2024/5/4 15:30:22 - redis 集群 (主从复制 哨兵模式 cluster)
目录 一 主从复制 (一)相关理论 1,主从复制定义 2,主从复制的作用 3,主从复制架构图 4 sync 同步过程 5,主从复制流程 (二) 实验模拟 1, 实验环境 2, 修…...
2024/5/5 8:33:53 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/4 23:54:56 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/4 23:54:56 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/6 9:21:00 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/4 23:55:16 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/4 23:55:06 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/4 23:55:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57