my blog my blog

Tag: Linux
Ubuntu资讯还是OMGUbuntu更新快

 

说ubuntu资讯呢,其实奶牛一直比较喜欢OMG!Ubuntu!这个网站的,站点设计风格很棒,而且更新速度绝对一流,跟国内的相比感觉还是相当专业的。推荐朋友们订阅OMG!Ubuntu这个网站,奶牛最近很少更新Ubuntu的资讯了,自己用ubuntu的时候不多,自从上次12.04的升级挂掉后,奶牛还是回归了Arch Linux,不过如果是对于新手朋友,奶牛还是强烈建议使用Ubuntu的,特别是国内的Deepin Linux,也相当值得关注,看到今天Deepin Music Player又有了小更新,感觉深度做东西还是很认真的,希望朋友们多多支持~奶牛以前使用过一段时间的Deepin Linux,比原版Ubuntu更符合国人的一些习惯,所以不用怕陌生,上手并没有那么难~本来打算假期来把ubuntuo.com这个网站做起来的,呃,现在发现,自己真的懒惰懒惰懒惰至极了,唉~~~再说吧,还是感觉有必要起个wiki站来介绍ubuntu或者linux入门,呃…

 

Grub2.0正式版发布

 

grub终于进入2.0正式版了,看网上的截图貌似没啥区别,看官方通告是各种各种支持的提升,呃,估计大部分一般桌面用户都用不到是真滴。

tarball文件下载:http://ftp.gnu.org/gnu/grub/grub-2.00.tar.gz

编译安装方法可以参考奶牛的文章:grub2编译安装

终于把这周的课设搞定了,可以回linux了…

Arch Linux下novacom驱动的使用方法

在AUR中,有novacom的开源驱动,是针对官方的deb包来做的修改。测试运行正常。

  1. yaourt -S palm-novacom 
  2. sudo rc.d start novacomd 
  3. novaterm -l        来查看设备是否已经在列表中 
  4. novaterm          链接设备 

默认安装完成后无法使用是因为没有开启服务,开启服务后一切正常。这样子就可以直接链接hp touchpad设备鸟~~~最近touchpad有更新一些android的补丁,mic已经工作正常鸟,兴奋下~~~

grub2对于usb无线键盘支持的设置方法

 

默认ubuntu的grub是支持usb无线键盘的,但是arch下默认的以及编译的grub都不能默认支持。这个问题困扰了奶牛很久了,昨天晚上终于搞定了。原因是没有加载usb_keyboard模块。需要在grub.cfg中添加如下模块的启动:

  1. insmod uhci 
  2. insmod usb_keyboard 
  3. insmod terminal_input usb_keyboard 

如果是usb 储存设备的支持

  1. insmod uhci
  2. insmod usbms 

顺便记录下,编译grub:

  1. ./configure --prefix=/usr --sysconfdir=/etc --disable-efiemu --disable-werror 

对于版本信息的更改,需要更改的文件是:

  1. grub-1.99/grub-core/normal/main.c  

嗯,知道上面这些,grub2的编译以及支持就差不多都搞定鸟

grub2编译安装

 

编译安装一次grub2,发现./configure会报错,很纠结。于是乎看.configure –help,知道可以添加  –disable-werror选项来把warning不归结到error中,然后编译成功。

记录下流程

  1. mkdir grub 
  2. cd grub 
  3. wget ftp://ftp.gnu.org/gnu/grub/grub-1.99.tar.gz 
  4. tar xzvf grub-1.99.tar.gz 
  5. cd grub-1.99 
  6. ./configure --prefix=/usr --sysconfdir=/etc --disable-werror 
  7. make 
  8. make install 

 

简明python教程中文pdf下载

 

推荐一个python的简明教程,大蟒蛇很出名哇,奶牛也要各种学习哇,感觉不错,推荐给朋友们,需要的下载拿走~~~

点此下载简明python教程

简明python教程目录:

前言
本书的读者
本书的由来
本书目前的状况
官方网站
约定条款
欢迎给我反馈
值得思考的一些东西
1. 介绍
简介
Python的特色
     概括
为什么不使用Perl?
程序员的话
2. 安装Python
Linux和BSD用户
Windows®用户
概括
3. 最初的步骤
简介
使用带提示符的解释器
挑选一个编辑器
使用源文件
     输出
     它如何工作
可执行的Python程序
获取帮助
概括
4. 基本概念
字面意义上的常量
字符串
变量
标识符的命名
数据类型
对象
     输出
     它如何工作
逻辑行与物理行
缩进
概括
5. 运算符与表达式
简介
运算符
运算符优先级
     计算顺序
     结合规律
表达式
     使用表达式
概括
6. 控制流
简介
if语句
     使用if语句
     它如何工作
while语句
     使用while语句
for循环
     使用for语句
break语句
     使用break语句
continue语句
     使用continue语句
概括
7. 函数
简介
     定义函数
函数形参
     使用函数形参
局部变量
     使用局部变量
     使用global语句
默认参数值
     使用默认参数值
关键参数
     使用关键参数
return语句
     使用字面意义上的语句
DocStrings
     使用DocStrings
概括
8. 模块
简介
     使用sys模块
字节编译的.pyc文件
from..import语句
模块的__name__
     使用模块的__name__
制造你自己的模块
     创建你自己的模块
     from..import
dir()函数
     使用dir函数
概括
9. 数据结构
简介
列表
     对象与类的快速入门
     使用列表
元组
     使用元组
     元组与打印语句
字典
     使用字典
序列
     使用序列
参考
     对象与参考
更多字符串的内容
     字符串的方法
概括
10. 解决问题——编写一个Python脚本
问题
解决方案
     版本一
     版本二
     版本三
     版本四
     进一步优化
软件开发过程
概括
11. 面向对象的编程
简介
self
     创建一个类
对象的方法
     使用对象的方法
__init__方法
     使用__init__方法
类与对象的变量
     使用类与对象的变量
继承
     使用继承
概括
12. 输入/输出
文件
     使用文件
储存器
     储存与取储存
概括
13. 异常
错误
try..except
     处理异常
引发异常
     如何引发异常
try..finally
     使用finally
概括
14. Python标准库
简介
sys模块
     命令行参数
     更多sys的内容
os模块
概括
15. 更多Python的内容
特殊的方法
单语句块
列表综合
     使用列表综合
在函数中接收元组和列表
lambda形式
     使用lambda形式
exec和eval语句
assert语句
repr函数
概括
16. 接下来学习什么?
图形软件
     GUI工具概括
探索更多内容
概括
A. 自由/开放源码软件(FLOSS)
B. 关于本书
后记
关于作者
关于译者
关于简体中文译本
C. 修订记录
时间表
术语表

表格

5.1 运算符与它们的用法
5.2 运算符优先级
15.1 一些特殊的方法

例子

3.1 使用带提示符的Python解释器
3.2 使用源文件
4.1 使用变量和字面意义上的常量
5.1 使用表达式
6.1 使用if语句
6.2 使用while语句
6.3 使用for语句
6.4 使用break语句
6.5 使用continue语句
7.1 定义函数
7.2 使用函数形参
7.3 使用局部变量
7.4 使用global语句
7.5 使用默认参数值
7.6 使用关键参数
7.7 使用字面意义上的语句
7.8 使用DocStrings
8.1 使用sys模块
8.2 使用模块的__name__
8.3 如何创建你自己的模块
8.4 使用dir函数
9.1 使用列表
9.2 使用元组
9.3 使用元组输出
9.4 使用字典
9.5 使用序列
9.6 对象与参考
10.1 备份脚本——版本一
10.2 备份脚本——版本二
10.3 备份脚本——版本三(不工作!)
10.4 备份脚本——版本四
11.1 创建一个类
11.2 使用对象的方法
11.3 使用__init__方法
11.4 使用类与对象的变量
11.5 使用继承
12.1 使用文件
12.2 储存与取储存
13.1 处理异常
13.2 如何引发异常
14.1 使用sys.argv
15.1 使用列表综合
15.2 使用lambda形式
linux系统编程pdf教程下载

 

今天为大家推荐一本linux系统编程的书.

书名:linux system programming(linux系统编程)
作者: Robert Love
出版社: O’Reilly

翻译是国内哈工大的同学做的,翻译还是很不错的.

linux系统编程目录:


前言
第一章 介绍与基本概念
第二章 文件I/O
第三章 缓冲式I/O
第四章 高级文件I/O
第五章 进程管理
第六章 高级进程管理
第七章 文件和目录管理
第八章 内存管理
第九章 信号
第十章 时间
附录GCC对C语言的扩展

奶牛也是通过这个学期我们开的linux课程开始接触linux的系统编程,发现其实用心学习也没有那么难~~~加油鸟,要有各种忙碌鸟~~~

下载地址:点此下载linux系统编程pdf中文版

linux c编程open() read() write()函数的使用方法及实例

 

今天把文件IO操作的一些东东整理下.基本的,对于锁机制下次再整理.常用的文件IO函数有标题的三个open() read() write() .首先打开一个文件使用open()函数,然后可以获取到一个文件描述符,这个就是程序中调用这个打开文件的一个链接,当函数要求到文件描述符fd的时候就把这个返回值给函数即可.read跟write都差不多,格式:read(文件描述符,参数,权限) write(文件描述符,参数,权限),返回值是读取或写入的字符数.其中的权限可以省略,文件描述符就是open()函数的返回值,而参数呢有O_RDONLY(只读) O_WRONLY(只写) O_RDWR(读写) O_CREAT(若不存在则新建) O_TRUNC(若不为空则清空文件)等.对函数想有更多了解可以察看linux下c编程的函数手册.

有些程序还是得自己动手写一下,自己不写就很难知道问题错在哪里,不知道自己是不是真的可以写出来.

写个小例子:文件备份程序

功能:输入一个"文件名",将生成"文件名.backup"的备份文件.若输入量超过两个或者无输入量,报错,若文件不存在或无权限,报错.成功返回提示.

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <string.h> 
  4. #include <fcntl.h> 
  5.  
  6. int main(int argc,char *args[]) { 
  7.     char buff[1024]; 
  8.     int fd1,fd2,i; 
  9.     int baksize = sizeof(args[1])+7; 
  10.     char bakfile[baksize]; 
  11. // input one file only 
  12.     if(argc != 2){ 
  13.         printf("Input one file a time!\n"); 
  14.         exit(1); 
  15.     } 
  16. //bakfile="XXX.backup"设置备份文件名称 
  17.     strcpy(bakfile,args[1]); 
  18.     strcat(bakfile,".backup"); 
  19. //open() 
  20.     fd1 = open(args[1],O_RDONLY,0644); 
  21.     fd2 = open(bakfile,O_RDWR|O_CREAT|O_TRUNC); 
  22.     if((fd1 < 0)||(fd2 < 0)){ 
  23.         printf("Open Error!Check if the file is exist and you have the permission!\n"); 
  24.         exit(1); 
  25.     }  
  26. //read from fd1 and write buff to fd2 
  27.     while((i = read(fd1,buff,sizeof(buff))) > 0) { 
  28.     write(fd2,buff,i);//这里需要用读取到的字符数,否则会出错,因为buff数组有可能未被全覆盖 
  29.     } 
  30.     close(fd1); 
  31.     close(fd2); 
  32.     printf("Backup done!\n"); 
  33.     exit(0); 
  34.      

 

linux c编程main函数的参数以及带参实例

 

写c程序,让用户一次又一次的输入参数输入回车是很不友好也很不明智的方法.所以为了更好的用户体验,参数应该可以在执行程序的时候直接就可以把参数都设定完成.好吧,说下main函数的参数.

一般我们就给main两个参数,写成如下形式:

main (int argc,char *argv[])

其中argc是统计的参数个数,默认为1.因为执行文件的文件名就是一个参数.

理所当然,argv[0]也是默认就有的,内容就是文件名.

当然,这个argc跟argv是可以更换为其它名称的,只要数据类型对就ok的.

解释这些估计就了解了个差不多了.然后直接看个实例就应该可以理解了.

实例:调用wget来下载一个文件.要求可以直接输入下载地址,如果输入两个参数则报错,提示使用方法:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <unistd.h> 
  4.  
  5. int main (int argc,char *args[]){ 
  6.     if(argc > 2){ 
  7.     printf("Error input!\nUsages:wget [http/ftp url]\n"); 
  8.     exit(1); 
  9.     } 
  10.     char *url = args[1]; 
  11.     printf("The URL is:%s\n",url); 
  12.     execlp("wget","wget","-c",url,NULL); 
  13.     exit(0); 

 

linux下daemon守护进程的编写实例

 

对于daemon守护进程,可能大多数朋友了解不多.对于守护进程,也就是说它由init直接来管理.举个例子:当我们打开一个terminal,输入gedit,然后编辑一些字,不要关闭gedit,这时候回到终端terminal,按ctrl+c,这时候你看到了什么,gedit关闭了对不对.因为gedit可以看成是一个进程哇,而且这时候终端并没有显示$或者#,结束的肯定是gedit的进程哇.如果我们想让这些进程在我们的后台运行,不受到terminal的限制,就需要来写一个daemon守护进程了.

这里说一下具体的方法:

1.fork()一个子进程

2.把父进程exit(0)退出,这时候子进程成为了一个孤立的进程,由init接管

3.setsid(),脱离控制终端,登录会话和进程组

介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号 (PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使 进程成为会话组长.当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。

4.close(i) ,关闭文件描述符

进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。

5.umask(0);重置文件权限掩码

6.更改当前的工作目录chdir(),这个可选

ok,这样子一个daemon就差不多了.

下面写了一个编程的实例,用wget 后台执行一个下载,然后把下载信息记录到info.txt文件中以便察看下载结果.

 

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <string.h> 
  4. #include <fcntl.h> 
  5. #include <sys/types.h> 
  6. #include <sys/wait.h> 
  7. #include <unistd.h> 
  8.  
  9. int main(){ 
  10.     pid_t daemon; 
  11.     int i,fd; 
  12.      
  13.     daemon = fork(); 
  14.     if(daemon < 0){ 
  15.         printf("Fork Error!"); 
  16.         exit(1); 
  17.     } 
  18.     else if (daemon > 0 ) { 
  19.         printf("Father process exited!"); 
  20.         exit(0); 
  21.     } 
  22.     setsid(); 
  23.     umask(0); 
  24.     for (i = 0;i < getdtablesize();i++){ 
  25.         close(i); 
  26.     } 
  27.     system("wget -c http://cdimage.ubuntu.com/daily-live/current/quantal-desktop-amd64.iso >info.txt 2>&1"); 
  28.     exit(0); 
  29.