日期:2014-05-16  浏览次数:20719 次

循序渐进学unix——上机记录(一)

    Unix上机课已经进行5次了,信息量越来越大,需要记的东西也越来越多。于是决定把一些重要的东西记在这里跟大家分享。


在法国学计算机一个很大的感触就是实践所占的比重相当大,大课的信息量极大,很难记住什么东西,但是与之辅助的小课实在是十分奏效。小课以20人的小班为单位,这就是人少的好处,能保证每个人都掌握相关的知识。这边的课确实比在国内深多了,能看出老师确实有很高的水平,讲的很深很细致。


Unix系统课已经上了很多节,这里只记录上机课的一些个人认为重要的知识点。前两节小课主题是Bash 基本命令,再此不记录了,这里主要涉及通过unix下的c语言编程了解系统原理。


第一课

1, 写一个c程序,打印从终端传入的参数。注意当参数为*结果。

       主函数生命为 void main(int argc, char ** argv)即可。argc为参数个数, argv为参数列表,注意argv[0]为命令本身,之后才为真正参数。

2,写一个程序,实现与"ls -il"相同的功能,即输出当前目录所有文件的有用信息,如访问模式,链接个数,最近修改时间等等。此函数利用了第一题的知识,即*会被翻译成当前目录下的所有文件。下面的程序在终端调用时参数为*。

     主要使用stat()函数。见man lstat, 需要详细阅读。stat能把相应文件的所有信息返回至一个结构体里。获得所有者用户名时用到getpwuid,组用户名时用到getgrgid, 相关函数还有ctime. 代码:

   

?#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>



int main(int argc, char **argv)

{
	int i;

	struct stat fileStat
;
	struct passwd *pwd;

	struct group *grp;

	char date[20];
	
	// pour tous les noms de fichiers passés en paramètres
	
for(i = 1; i < argc; i++)
	
{
		// collecte des infos
		
	if(lstat(argv[i], &fileStat)) 
	{ 
		perror("stat"); 
		exit(errno); 
	}
		
		// numéro d'I-noeud :I-noeud个数
		printf("%d ", (int)fileStat.st_ino);
		
		// mise en forme des permissions 各种权限
		switch(fileStat.st_mode & S_IFMT)
		{	
			case S_IFSOCK : printf("s"); break;
			case S_IFLNK : printf("l"); break;
			case S_IFREG : printf("-"); break;
			case S_IFBLK : printf("b"); break;
			case S_IFDIR : printf("d"); break;
			case S_IFCHR : printf("c"); break;
			case S_IFIFO : printf("p"); break;
			default : printf("?");
		} 

		if((fileStat.st_mode & S_IRUSR) == S_IRUSR) printf("r"); else printf("-");
		if((fileStat.st_mode & S_IWUSR) == S_IWUSR) printf("w"); else printf("-");
		if((fileStat.st_mode & S_IXUSR) == S_IXUSR) 
			if((fileStat.st_mode & S_ISUID) == S_ISUID) printf("s"); else printf("x");
		else
			if((fileStat.st_mode & S_ISUID) == S_ISUID) printf("S"); else printf("-");
			
		if((fileStat.st_mode & S_IRGRP) == S_IRGRP) printf("r"); else printf("-");
		if((fileStat.st_mode & S_IWGRP) == S_IWGRP) printf("w"); else printf("-");
		if((fileStat.st_mode & S_IXGRP) == S_IXGRP)
			if((fileStat.st_mode & S_ISGID) == S_ISGID) printf("s"); else printf("x");
		else
			if((fileStat.st_mode & S_ISGID) == S_ISGID) printf("S"); else printf("-");

		if((fileStat.st_mode & S_IROTH) == S_IROTH) printf("r"); else printf("-");
		if((fileStat.st_mode & S_IWOTH) == S_IWOTH) printf("w"); else printf("-");
		if((fileStat.st_mode & S_IXOTH) == S_IXOTH)
			if((fileStat.st_mode & S_ISVTX) == S_ISVTX) printf("t"); else printf("x");
		else
			if((fileStat.st_mode & S_ISVTX) == S_ISVTX) printf("T"); else printf("-");

		// nombre de liens dur 硬链接个数
		
printf(" %d ", (int)fileStat.st_nlink);
		
		// nom du propriétaire 所有者用户名
		if ((pwd = getpwuid(fileStat.st_uid)) != NULL)
			printf("%s ", pwd->pw_name);
		else
			printf("%d ", fileStat.st_uid);
		
		// nom du groupe  组用户名
		if ((grp = getgrgid(fileStat.st_gid)) != NULL)
			printf("%s ", grp->gr_name);
		else
			printf("%d ", fileStat.st_gid);
		
		// taille du fichier en octets 文件大小
		printf("%d ", (int)fileStat.st_size);
		
		// date de dernière modification 修改时间
		strftime(dat