西邮Linux兴趣小组10级暑期学习周总结
第二周(7月22日至7月28日)
第一组
组长:刘丹阳
组员:王涛 陈雍 王亚莉 黄傲妮 黄博才 刘丹阳
本周任务:
完成《鸟哥Linux的私房菜》基础学习篇第六、七章的学习。
完成《Linux C 编程实战》第六章的学习
陈雍第二周学习总结
本周通过对《鸟哥的私房菜》磁盘管理部分,和linux下C编程实战网络编程的学习。
1.学会了一些硬盘的知识,如硬盘前446字节为mbr,下来64字节为分区表,他们对对硬盘的重要性,以及利用 dd if=/dev/sda of=backup bs=512 count=1 来实现对硬盘的mbr以及分区表的备份,和利用相反命令 dd if=backup of=/dev/sda bs=512 count=1 来实现对已损坏的mbr或分区表进行修复。
2.利用新分区对swap空间的扩展,以及对swapon,swapoff命令的使用。利用dd if=/dev/zero of=test bs=1M count=100 ,mkswap test。 swapon test可实现利用文件对swap的扩展。还有-p参数来实现对不同扩展的swap优先级的管理。另外,利用dd命令,可以对U盘内容进行类似加密的处理,还可以新增很多文件系统以供使用。
3.学会了利用tune2fs 命令来实现查看磁盘的详细信息,如磁盘的卷标,挂载选项,UUID,还有对这些信息的修改,如再挂载选项中可加入是否支持ACL以及磁盘限额。可修改磁盘卷标以方便在/etc/fstab利用LABLE=”...”使其开机自动挂载。
4.了解了linux下网络编程的基本方法以及工作模式,以及基于C/S模型的网络程序的实现原理。套字的创建,端口绑定和监听,连接和接收。和其中所涉及到的函数。
问题:
在实现本地端口监听的时候又个问题一直不明白:
我的程序大致为
#define PORT 8000
main()
{
#define PORT 8000 //自定义端口号
#define BACKLOG 10 //最大连接数
int main()
{
//创建socket
int sock_fd;/*监听socket*/
int client_fd;//传输socket
struct sockaddr_in my_addr;//本机IP
struct sockaddr_in remote_addr;//客户机IP
sock_fd=socket(AF_INET,SOCK_STREAM,0);//创建本机socket,ipv4,TCP流
if(sock_fd<0) {printf("创建socket失败");exit(1);}//创建失败时退出
//设置socket
my_addr.sin_family=AF_INET;//地址类型:ipv4
//端口号:8000
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);//自动填入本机IP
//inet_addr("192.168.200.172");//手动设置ip地址
memset(my_addr.sin_zero,0,sizeof(my_addr.sin_zero));//填充0
//绑定端口
if(bind(sock_fd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr_in))<0){perror("端口绑定失败,可能的原因");exit(2);}//绑定端口失败时退出
//监听端口
if(listen(sock_fd,BACKLOG)<0){perror("端口监听失败,可能的原因");exit(3);}//端口被占用或禁用时退出
(当直接写到这里然后编译,执行后发现本机的8000端口并没有处于监听状态)
…...
(但如果在这之后加一个死循环,发现本机的8000端口处于监听状态)
}
这是为何?那死循环明明是加在listen()函数之后的,加或不加那个listen()函数都是执行的一次啊,为什么加了死循环就可以让端口监听。而且我并没有用close()来关闭套节字。
黄傲妮第二阶段学习总结
一、学习小结
在第一阶段学习的基础上,这一周接触了相对来说比较难的文件操作,这一周主要学习了《linux C编程实战》的文件操作这一章;还有学习了鸟哥第六章文件属性与目录配置,第七章文件和目录管理,主要掌握了一些有关的命令。
二、存在问题
对于文件操作这一章,可能因为刚接触感觉得有点难,截止现在文件操作自己还是不能写出来,但是经过反复看反复思考还有请教学长,对文件操作加深了理解;对于文件操作不知道其他人有没有较好的学习技巧,希望可以得到指点。
三、心得体会
在这一周又学习很多新东西,虽然有的很难理解,但是一定坚持到底!继续探究!
黄博才第二周小结
在这周里我主要还是精读《鸟哥的linux私房菜》,总算清楚了linux文件系统的框架,也懂得一些linux磁盘与文件系统管理,对一些基本的命令也逐渐熟悉了。当然,这主要靠多练习才会熟悉的,我基本都跟着书上的说的练习,在练习磁盘管理时,生怕搞坏硬盘,于是我拿个u盘试验,有的命令是可以在u盘上,但有些就有所限制了,一开始以为是鸟哥所说的文件系统格式和我的不一样,但后来才弄明白硬盘和u盘的存储机制是不一样的,所以多了解一些硬件方面的知识对理解文件系统和编程是有好处的;学习文件与目录的默认权限与隐藏权限时似懂非懂,然而通过学长的辅导也弄明白了学多…… 对于《linux c编程实战》,只看了前两节,算是对c语言基础的巩固和复习啦;此外,我也看了一点数据结构的内容,认识一点基本概念而已。
一个关于栈的问题不太明白:
// 例1 :入栈操作
typedef struct Node LStackNode;
typedef struct Node *LStackedStack;
void PushLinkStack(LinkedStack S , ElemType x)
{
LinkStack *p;
p = (LStackNode *)malloc(sizeof(StackNode)); /*生成新结点*p */
if(p == NULL)
{
printf("申请空间失败!“);
exit(0);
}
p->data = x;
p->next = S->top;
S->top = p;
}
//以上是书本的例子,我认为它不用间接来使用top指针,在网上找到下面的例子
// 例2 :入栈/*将元素x插入链栈top的栈顶*/
void PushLinkStack(LinkStack* &s , ElemType x)
{
LinkStack *p;
p = (LinkStack *)malloc(sizeof(LinkStack)); /*生成新结点 */
p->data = x;
p->next = s;
s = p;
}
我主要意思是书上的那个为什么还要另外加一个指针S(和top类型同),直接使用top(或S)一个行不? 用s有什么好处吗?
刘丹阳第二周学习总结:
这周把鸟哥的第六章和《linux C编程实战》的第7,8张看完了。到并发处理后感觉编程难度直接就上来了。其实主要是遇见的新函数太多了,一时半会可能不能完全记住。其实说到底这些函数的使用熟练度还是在于平常的多加练习才行。多写树上的程序觉得理解起来就相对容易多了。
再来谈谈变成中遇到的问题,其实主要是并发处理那部分锁的概念还不是很清楚。共享锁,互拆锁,条件变量这些控制进程和线程的同步与异步的功能还要多加练习。其实我一直不明白对于单核单cpu来说存在多程序的并行执行么?即使在编程中给它使用了多线程的技术,但是在实际情况中该程序还是同步执行的。。。并没又涉及到异步问题。所以再以后的学习中还要继续理解。
下周计划继续看鸟哥,然后看《POSIX多线程程序设计》来加强这些多线程的理解。
王涛第二周学习总结
一 .linux下c编程实战
1.经过上一周的学习,对于linux下的文件操作有了初步的学习,但是在一些细节的理解上还是有待提高,所以本周继续加深对文件操作的理解,对常用的函数的总结。
用open,write,read系统调用编写的两个版本的copy文件的程序,但是两者在效率上的差距说明了系统调用的开支是很巨大的。
版本1:
#include
#include
#include
#include
#include
int main( int argc,char **argv)
{
int count;
char block[1024];
int fileno1,fileno2;
fileno1 = open(*++argv, O_RDONLY);
fileno2 = open(*++argv, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
while ((count = read(fileno1, block, 1024)) > 0)
write(fileno2,block,count);
return 0;
}
版本2:
#include
#include
#include
#include
#include
int main( int argc,char **argv)
{
char c;
int fileno1,fileno2;
fileno1 = open(*++argv, O_RDONLY);
fileno2 = open(*++argv, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
while (read(fileno1, &c, 1) == 1)
write(fileno2,&c,1);
return 0;
}
对于1m的数据文件,两个程序的执行时间和效率都是不同的,所以在每一次系统调用时尽可能多的写出或写入数据是很有必要的,提高程序的效率。
相对于函数调用,系统调用的开销要大一些。但是硬件也会对底层系统调用一次能读写的数据会有一定的限制!
二. 鸟哥私房菜
这一周主要学习了鸟哥私房菜上面的第二部分,对文件与目录的管理,和文件系统做了简单的了解,以及一些常用命令的学习。
三. 问题。
在看c语言的时候遇到一个问题:
int *p = (int *)0xbffff328;
*p = NULL;
本来在第二句执行完后,应该是把地址0xbffff328中存的值改为0,但是p的地址直接就变为了0x0,为什么?
王亚莉第二周
第一,学习心得
1.通过对档案权限和目录配置和档案与目录管理的学习,慢慢喜欢上新系统啦,呵呵,很神奇很好玩儿;
2.编程实战中也有很多有趣的地方,但是一边下来,有很多地方还是很不懂。
第二,学习进度
1.鸟哥至今完成了第六七章;
2.实战编程第六章的第三节。
第三,遇到的问题
1.学习进度是完成了百分之七十,但是也只能算是有一个大概印象,要达到记忆精确现在的状态还差很远哦;
2.C语言需要恶补啦,呜呼;
5.在和同学听了一节C++之后,感觉原本想做的事情,不能这样老是这样拖着,现在只想行动起来,无论如何,全力以赴,做好自己现在这个阶段想要做的事情,嘻嘻。
小组周总结与讨论:
1、关于陈雍的问题,小组内部进行了讨论:
回答:此问题涉及进程方面的问题,因为进程打开后开始执行main()函数,如果没有最下面这个循环,进程在listen后会结束。而有了循环后进程不会结束。结束意味着会结束所有关于此程序的内容,所以监听也会因进程的结束而结束,很好证明这个,在程序的最后设置一个sleep(10)函数,之后可以观察到listen十秒后消失。
2关于王涛的问题:
回答:王涛的问题设计申请动态空间的问题,因为NULL是一个指着其值为(void *)0,C语言中指针站4字节,所以如果仅仅给*p=NULL是错误的,而应该是给p申请一个空间,这样就能保存此空指针了。
3关于黄博才的问题:
回答:原因是书上的例子错误了,而不是其他原因。
小组现阶段存在问题:组内成员有时候给的问题不够详细,希望可以具体化,方便大家讨论。
希望大家坚持住下一个星期,继续认真完成学习任务,不断的总结提高。