stat函数讲解:
表头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
1
2
3
定义函数: int stat(const char *file_name, struct stat *buf);
函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值: 执行成功则返回0,失败返回-1,错误代码存于errno
错误代码:
ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长
1
2
3
4
5
6
7
接口函数
int stat(const char *file_name,struct stat *buf);
int fstat(int filedes,struct stat *buf);
1
2
stat 结构定义于:/usr/include/sys/stat.h 文件中
struct stat {
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; //i-node节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件最后被访问的时间
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态(属性)改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //文件内容对应的块数量
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stat用来判断没有打开的文件,而fstat用来判断打开的文件.我们使用最多的属性是st_mode.通过着属性我们可以判断给定的文件是一个普通文件还是一个目录,连接等等.
常用宏
S_ISLNK(st_mode):是否是一个连接.
S_ISREG是否是一个常规文件.
S_ISDIR是否是一个目录
S_ISCHR是否是一个字符设备.
S_ISBLK是否是一个块设备
S_ISFIFO是否是一个FIFO文件.
S_ISSOCK是否是一个SOCKET文件.
1
2
3
4
5
6
7
下面的程序中有一小撮有用到S_ISFIFO
#include <stdio.h>
#include <unistd.h>
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <fcntl.h> /* Obtain O_* constant definitions */
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <error.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
void client(int,int),server(int,int);
#define MAXLINE 4096 /* max text line length */
#define FIFO_NAME "/tmp/mplayer.fifo"
int main(int argc,char *argv[]){
int pipe1[2],pipe2[2],r,fd;
pid_t childpid;
int check_up=0;
check_up=pipe(pipe1);
assert(check_up>=0);
check_up=pipe(pipe2);
assert(check_up>=0);
r = mkfifo(FIFO_NAME, 0755);
if( -1 == r){
assert(errno == EEXIST);
}
fd = open(FIFO_NAME, O_RDWR);
assert(fd!=-1);
struct stat buf;
fstat(pipe1[0],&buf);
if(check_up=S_ISFIFO(buf.st_mode)){//这里的返回值是1
printf("check_up=%d,pipe1[0] is a fifo file\n",check_up);
}else{
printf("it is ...\n");
}
fstat(fd,&buf);
if(check_up=S_ISFIFO(buf.st_mode)){//这里的返回值为什么也是1,有大佬能解释一下吗
//如果都一样怎么区分管道和FIFO
printf("check_up=%d,fd is a fifo file\n",check_up);
}else{
printf("it is ...\n");
}
childpid=fork();
assert(childpid>=0);
if(childpid==0){
close(pipe1[1]);//用1读
close(pipe2[0]);//用2写
server(pipe1[0],pipe2[1]);
exit(0);
}
close(pipe1[0]);//用1写
close(pipe2[1]);//用2读
client(pipe2[0],pipe1[1]);
exit(0);
}
void client(int readfd, int writefd)
{
size_t len;
ssize_t n;
char buff[MAXLINE];
/* 4read pathname */
fgets(buff, MAXLINE, stdin);
len = strlen(buff); /* fgets() guarantees null byte at end */
if (buff[len-1] == '\n')
len--; /* delete newline from fgets() */
/* 4write pathname to IPC channel */
write(writefd, buff, len);
/* 4read from IPC, write to standard output */
while ( (n = read(readfd, buff, MAXLINE)) > 0)
write(STDOUT_FILENO, buff, n);
}
void server(int readfd, int writefd)
{
int fd;
ssize_t n;
char buff[MAXLINE+1];
/* 4read pathname from IPC channel */
if ( (n = read(readfd, buff, MAXLINE)) == 0){
printf("end-of-file while reading pathname");
exit(0);
}
buff[n] = '\0'; /* null terminate pathname */
if ( (fd = open(buff, O_RDONLY)) < 0) {
/* 4error: must tell client */
snprintf(buff + n, sizeof(buff) - n, ": can't open, %s\n",
strerror(errno));
n = strlen(buff);
write(writefd, buff, n);
} else {
/* 4open succeeded: copy file to IPC channel */
while ( (n = read(fd, buff, MAXLINE)) > 0)
write(writefd, buff, n);
close(fd);
}
}
---------------------
作者:llongint
来源:CSDN
原文:https://blog.csdn.net/qq_36337149/article/details/81214047
版权声明:本文为博主原创文章,转载请附上博文链接!
stat函数讲解:表头文件:#include &lt;sys/types.h&gt;#include &lt;sys/stat.h&gt;#include &lt;unistd.h&gt;123定义函数: int stat(const char *file_name, struct stat *buf);函数说明: 通过文件名filename获取文件信息,并保存在buf所指的...
S_
ISLNK
(st_mode) // 是否是一个连接.
S_ISREG(st_mode) // 是否是一个常规文件.
S_
ISDIR
(st_mode) // 是否是一个目录
S_
ISCHR
(st_mode) // 是否是一个字符设备.
S_
ISBLK
(st_mode) // 是否是一个块设备
S_ISF...
├─sda2 8:2 0 400M 0 part /boot
├─sda3 8:3 0 390.6G 0 part /
├─sda4 8:4 0 97.7G 0 part /home
├─sd...
S_
ISCHR
(st_mode):是否是一个字符设备.
S_
ISBLK
(st_mode):是否是一个块设备
S_IS
FIFO
(st_mode):是否 是一个
FIFO
文件.
S_I
SSO
CK
(st_mode):是否是一个SO
CK
ET
S_
ISCHR
(st_mode):是否是一个字符设备.
S_
ISBLK
(st_mode):是否是一个块设备
S_IS
FIFO
(st_mode):是否 是一个
FIFO
文件.
S_I
SSO
CK
(st_mode):是否是一个SO
CK
ET文件
man 2 stat 可以查到stat数据结构,其中的st_mode就是上面几个宏的输入参数
struct stat
其中比较重要的就是struct so
ck
et和struct so
ck
两个结构体。
每个so
ck
et数据结构都有一个so
ck
数据结构成员,so
ck
是对so
ck
et的扩充,两者一一对应,so
ck
et->sk指向对应的so
ck
,so
ck
->so
ck
et 指向对应的so
ck
et;
so
ck
et和so
ck
是同一事物的两个侧面,...
修改文件权限
1.int chmod(const char * path, mode_t mode);
函数说明:chmod()会依参数mode 权限来更改参数path 指定文件的权限。
参数 mode 有下列数种组合:
1、S_IFMT 0170000 文件类型的位遮罩
2、S_IFSO
CK
0140000 scoket
3、S_IFLNK 0120000 符号连接
4、S_IFR
S_
ISCHR
(st_mode):是否是一个字符设备.
S_
ISBLK
(st_mode):是否是一个块设备
S_IS
FIFO
(st_mode):是否 是一个
FIFO
文件.
S_I
SSO
CK
(st_mode):是否是一个SO
CK
ET文件
man 2 stat 可以查到stat数据结构,其中的st_mo
在sys/stat.h中还定义了更多相关的函数
The following symbolic names for the values of type mode_t shall also be defined.
File type:
S_IFMT
Type of file.
S_IFBLK
Blo
ck
special.
在 include/sys/stat.h 文件中增加新文件类型和测试宏,增加的内容如下:
#define S_IFPROC 0030000
#define S_ISPROC(m) (((m) & S_IFMT) == S_IFPROC) //测试m是否是proc文件
2.修改mknod函数
使创建结点的mknod() 函数支持新的文件类型,修改 fs/namei.c...
有三个办法,
1。把大数字切成多段,从前面进行运算,头部算出的结果,立即进入流水线进入下一步运算。
2. 增加对进位的判断,对一些经过判断就可以得到的提前进位,先把他囊括在内,以后这部分进位就不加考虑了,也减小了进位对从前面高位输出结果的干扰,保证了从高位分段输出计算结果,进入计算流水线下一步运算。
3.是多置一些存储进位的单元,暂时存储一下在提前进位时未来得及全部处理掉的一些进位,也就是把一部分进位拦截一下,这就要舍弃现在数字的单行表示方式,如同多一排算盘珠子存进位,一同把进位下一步和实际的乘数一起进入运算。保证计算结果从高位的输出,输出结果进入下一步计算流水线,如此一来,连续大数乘除做的多了,此方法就显出优势了。
3分钟了解入门「机器学习」该学习什么?(下)
我叫奶狗我很柴w:
RTP协议分析
瀚海拾英:
Ubuntu14.04下搜狗输入法安装
qq_58577758:
CarPlay wired(USB)连接方案
什么时候是个头: