编写一个who命令:
who
命令用来查看谁登录了系统(show who is logged on ),每一行代表一个巳经登录的用户,第1列是用户名,第2列是终端名,第3列是登录时间。
who
的联机帮助说who
要读utmp这个文件,进一步,从以上的说明可以知道utmp这个文件里面保存的是结构体数组,数组元素是utmp类型的结构,utmp结构保存了登录记录。它包含9个成员变量,ut_user 数组保存登录名,ut_line 数组保存设备名,也就是用户的终端类型,ut_time 保存登录时间。
who命令伪代码:
打开utmp 文件
读取utmp中的每一条记录
显示记录中的相关信息
关闭utmp文件
who命令代码:
#include <stdio.h>
#include <stdlib.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#define SHOWHOST
int show_info( struct utmp *utbufp )
{
printf("%-8.8s", utbufp->ut_name);
printf(" ");
printf("%-8.8s", utbufp->ut_line);
printf(" ");
printf("%10ld", utbufp->ut_time);
printf(" ");
#ifdef SHOWHOST
printf("(%s)", utbufp->ut_host);
#endif
printf("
");
return 0;
}
int main()
{
struct utmp current_record;
int utmpfd;
int reclen = sizeof(current_record);
/*打开UTMP_FILE读取信息,如果打开失败则输出失败信息。*/
if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
perror( UTMP_FILE );
exit(1);
}
/*读取信息到存储器中,reclen就是是读的字节数,然后再调用函数打印出来。*/
while ( read(utmpfd, ¤t_record, reclen) == reclen )
show_info(¤t_record);
close(utmpfd);
return 0;
}
运行who命令:
2
编写一个cp命令:
伪代码:
打开源文件
创建目标文件
针对源文件
把源文件读入缓冲区
把缓冲区内容写入目标文件
关闭源文件和目标文件
代码:
ls:
ls老师给了两个代码,第一个实现功能显示当前文件夹内容,第二个在第一个的基础上更加完善,还可显示出文件的详细信息,如读写权限,大小和创建时间等
ls实现的功能:
ls -l:显示文件信息
ls -a:列出文件目录
ls -lu:最后访问时间
ls -s:以块为单位的文件大小
ls -t:按时间排序
ls -F:显示文件类型
文件树
文件和目录被组织成目录树(tree),节点是目录或者文件
目录是一种特殊文件,文件内容就是目录和文件的名字,与utmp类似
与文件不同,目录不会为空
伪代码:
打开目录文件
针对目录文件
读取目录条目
显示文件名
关闭文件目录文件
ls代码:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
void do_ls(char []);
int main(int argc, char *argv[])
{
if ( argc == 1 )
do_ls( "." );
else
while ( --argc ){
printf("%s:
", *++argv );
do_ls( *argv );
}
return 0;
}
void do_ls( char dirname[] )
{
DIR *dir_ptr;
struct dirent *direntp;
if ( ( dir_ptr = opendir( dirname ) ) == NULL )
fprintf(stderr,"ls1: cannot open %s
", dirname);
else
{
while ( ( direntp = readdir( dir_ptr ) ) != NULL )
printf("%s
", direntp->d_name );
closedir(dir_ptr);
}
}
5