20145306张文锦

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

编写一个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("\n");
 
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, &current_record, reclen) == reclen )
show_info(&current_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:\n", *++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\n", dirname);
else
{
while ( ( direntp = readdir( dir_ptr ) ) != NULL )
printf("%s\n", direntp->d_name );
closedir(dir_ptr);
}
}
 
 

 



5

 

代码托管链接

 
 
posted on 2016-11-20 17:24  20145306张文锦  阅读(264)  评论(2编辑  收藏  举报