关于linux程序设计的问题.

关于linux程序设计的问题.,第1张

在开始添加:

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__$$

两个下划线,错了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7991229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存