struct stat buf
在50行添加:
if(ent->d_type != DT_DIR)
{
stat(dp, &buf)
printf("inode:%d", buf.st_info)
printf("fmt_mode:%d", fmt_mode(buf.st_mode))
printf("nlink:%d", buf.st_nlink)
printf("filename:%s", ent->d_name)
}
以下是讲解:
这个题目的要求是让你扩充ch05-catdir.c 中的程序,在遍历到每一个文件时,调用stat函数,然后打印出节点号(inode number), 函数fmt_mode()的执行结果( the result of fmt_mode()), 连接数( the link count),文件名( the file's name)。
在源程序的第50行,通过ent->d_type == DT_DIR先判断一下当前readdir打开的是目录还是文件。
然后调用stat函数。这是stat函数的函数说明:
表头文件:#include <sys/stat.h>
#include <unistd.h>
定义函数:int stat(const char *file_name, struct stat *buf)
函数说明:通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值: 执行成功则返回0,失败返回-1,错误代码存于errno
struct stat buf
stat(dp, &buf)
读出的数据放在buf中,buf是stat类型的,结构如下:
struct stat {
dev_t st_dev //文件的设备编号
ino_t st_ino //节点
mode_tst_mode //文件的类型和存取的权限
nlink_t st_nlink//连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid //用户ID
gid_t st_gid //组ID
dev_t st_rdev //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size //文件字节数(文件大小)
unsigned long st_blksize //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks //块数
time_tst_atime//最后一次访问时间
time_tst_mtime//最后一次修改时间
time_tst_ctime//最后一次改变时间(指属性)
}
我们只需打印出buf.st_ino, fmt_mode(buf.st_mode) ,buf.st_nlink, 和 ent->d_name即可。
我的作业,你凑合着用吧//msgq_send.c
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>
#define MAXSIZE 256
int main(int argc, char *argv[])
{
if (argc <2)
{
printf("Error args\n")
return -1
}
int msgid
msgid = msgget((key_t)2000, IPC_CREAT | 0644)
if (msgid == -1)
{
printf("msgget error\n")
return -1
}
if (msgsnd(msgid, (void *)argv[1], MAXSIZE, 0) == -1)
{
printf("msgsnd error\n")
return -1
}
return 0
}
//msgq_recv.c
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>
#define MAXSIZE 256
int main(void)
{
int msgid
int msgsize
char buff[MAXSIZE]
msgid = msgget((key_t)2000, IPC_CREAT | 0644)
if (msgid == -1)
{
printf("msgget error\n")
return -1
}
msgsize = msgrcv(msgid, (void *)&buff, MAXSIZE, 0, 0)
if (msgsize == -1)
{
printf("msgrcv error\n")
return -1
}
printf("%s\n", buff)
return 0
}
//Makefile
TARGET := msgq_send msgq_recv
CC := gcc
CFLAGS := -Wall -g
all: msgq_send msgq_recv
msgq_send: msgq_send.o
$(CC) $(CFLAGS) $^ -o $@
msgq_recv: msgq_recv.o
$(CC) $(CFLAGS) $^ -o $@
clean:
rm -fr *.o $(TARGET)
.PHONY :clean
你的程序有两个问题,1,
trap
'rm
-f
/tmp/my_tmp_file_$$'
INT
这里应该用
双引号
"
"
将rm命令括起来,用单引号,
$$
不会变成进程pid
2,
while
[
-f
/tmp/my_tmp_file__$$
]
你一直使用的是
/tmp/my_tmp_file_$$,
但是这里却用的是
file__$$
两个下划线,错了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)