如果我有一个已知的文件描述符打开的文件,什么是使用的优点fstat(),对stat()?为什么不只有一个功能?
int fstat(int fildes, struct stat *buf)
int stat(const char *path, struct stat *buf)
Run Code Online (Sandbox Code Playgroud) 我正在尝试理解该stat命令的stat结构的st_mode字段的标志,但是我有这么难的时间!我在这里找到了这个例子,但我真的不明白这个代码片段:
if ( mode & S_IRUSR ) str[1] = 'r'; /* 3 bits for user */
if ( mode & S_IWUSR ) str[2] = 'w';
if ( mode & S_IXUSR ) str[3] = 'x';
if ( mode & S_IRGRP ) str[4] = 'r'; /* 3 bits for group */
if ( mode & S_IWGRP ) str[5] = 'w';
if ( mode & S_IXGRP ) str[6] = 'x';
if ( mode & S_IROTH ) str[7] = 'r'; /* 3 …Run Code Online (Sandbox Code Playgroud) 我正在从一本书中学习,在Unix上实现(ls)命令.在使用(-l)标志执行(ls)命令的编码部分期间,我看到我必须提示文件的用户名和组名.到目前为止,我有以下几行中的用户和组ID:
struct stat statBuf;
statBuf.st_uid; //For the user id.
statBuf.st_gid; //For the group id.
Run Code Online (Sandbox Code Playgroud)
在Unix上的默认(ls)命令中,打印文件的信息的方式是显示用户名而不是用户ID.
任何人都可以帮我找到正确的方法来从他们的ID中检索用户名和组名吗?
在linux中,当stat()与断开的链接文件一起使用时,它会失败-1.所以我用了lstat()哪个成功了.
对于Windows中的相同情况,_stat()失败的快捷方式失败,但_lstat()在Windows中没有.请帮助lstat()在Windows中找到替代方案.
我正在编写一个程序,它从父目录中查找包含大量文件的所有子目录os.File.Readdir,但运行一个strace查看系统调用的计数表明go版本使用的lstat()是所有文件/目录.父目录.(我现在用/usr/bin目录测试这个)
去代码:
package main
import (
"fmt"
"os"
)
func main() {
x, err := os.Open("/usr/bin")
if err != nil {
panic(err)
}
y, err := x.Readdir(0)
if err != nil {
panic(err)
}
for _, i := range y {
fmt.Println(i)
}
}
Run Code Online (Sandbox Code Playgroud)
程序上的Strace(没有跟随线程):
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
93.62 0.004110 2 2466 write
3.46 0.000152 7 22 getdents64
2.92 0.000128 0 2466 …Run Code Online (Sandbox Code Playgroud) 我最近了解到,不同的操作系统甚至同一操作系统下的不同文件系统都支持lstat.
返回的Stats对象给了我们四次,每次都有两种不同的味道。
js日期对象:
atime:自 POSIX Epoch 以来该文件最后一次被访问的时间以毫秒表示mtime: 最后一次修改这个文件...ctime: 上次更改文件状态...birthtime:这个文件的创建时间( atimeMs, mtimeMs, ctimeMs, 和birthtimeMs是上述每个的 js 日期对象版本)
“已修改”表示文件的内容通过写入等方式发生了更改。“已更改”表示文件的元数据(例如所有者和权限)已更改。
Linux 传统上从不支持出生时间的概念,但随着更多更新的文件系统确实支持它,如果我没有正确阅读,它最近已经添加了对 Linux 堆栈的所有相关层的支持。
但是 Windows 和 Mac 都像它们的原生文件系统一样支持出生时间。
另一方面,Windows 传统上不支持与文件修改分开的文件更改概念。但是为了符合 POSIX,它增加了对 API 级别和 NTFS 的支持。(尽管它似乎没有在 GUI 或命令行中的任何地方公开)。FAT fs 不支持。
当我lstat在 NTFS 驱动器上调用Windows 上的文件时,结果ctime看起来不错。当我在 FAT 驱动器上的文件上调用它时,它ctime包含垃圾。(就我而言,它始终2076-11-29T08:54:34.955Z适用于每个文件。)
我不知道这是不是一个错误。
我不知道birthtimeLinux …
在Linux下,我有两个文件路径A和B:
const char* A = ...;
const char* B = ...;
Run Code Online (Sandbox Code Playgroud)
我现在想确定,我应该open(2)两个......
int fda = open(A, ...);
int fdb = open(B, ...);
Run Code Online (Sandbox Code Playgroud)
...我会在文件系统中打开两个文件句柄到同一个文件吗?
为了确定这一点,我想到了stat(2):
struct stat
{
dev_t st_dev;
ino_t st_ino;
...
}
Run Code Online (Sandbox Code Playgroud)
像(伪代码)的东西:
bool IsSameFile(const char* sA, const char* sB)
{
stat A = stat(sA);
stat B = stat(sB);
return A.st_dev == B.st_dev && A.st_ino == B.st_ino;
}
Run Code Online (Sandbox Code Playgroud)
有没有A和B是同一个文件但IsSameFile会返回false的情况?
是否有任何情况下A和B是不同的文件但IsSameFile会返回true?
有没有更好的方法来做我想做的事情?
我正在尝试编写一个TCP服务器,客户端可以使用它来浏览服务器的目录.除此之外,如果是常规文件,我想发送目录的大小.文件的大小保存在"stat"结构下的size_t变量中.我在这做这个:
char *fullName /* The path to the file *.
/**
* Some code here
*/
struct stat buffer;
lstat(fullName, &buffer)
Run Code Online (Sandbox Code Playgroud)
所以现在buffer.st_size包含文件的大小.现在我想写()它到监听套接字,但显然我必须以某种方式将其转换为字符串.我知道这可以通过按位右移(>>)运算符以某种方式完成,但对我来说似乎太痛苦了.你能帮帮我吗(即使其他那些按位运算符也没办法)?
顺便说一句,这不适合学校或smth ......
PS:我在Linux上运行它.
您好,我需要有关具有某些 PID 的进程的以下信息:
名称、ppid、状态、#ofOpenFiles、#ofThreads
我知道 /proc/pid/stat 文件的示例如下:
15(看门狗/1) S 2 0 0 0 -1 69239104 0 0 0 0 0 69 0 0 -100 0 1 0 6 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 1844674407370 9551615 0 0 17 1 99 1 0 0 0 0 0 0 0 0 0 0 0
我当前尝试解析此类文件:
FILE *fp;
char buff[255];
fp= fopen("/proc/123/stat", "r");
if(fp == NULL){
}else{
fscanf(fp, "%d %s %c %d %d %d %d %d …Run Code Online (Sandbox Code Playgroud) 将一些代码转换为使用asyncio,我想尽快将控制权交还给asyncio.BaseEventLoop。这意味着避免阻塞等待。
如果没有 asyncio,我会使用os.stat()或pathlib.Path.stat()获取例如文件大小。有没有办法用 asyncio 有效地做到这一点?
我可以结束stat()通话,使其成为类似于此处描述的未来吗?