linux程序设计学习笔记(1-6)

一、入门

查看linux的环境变量 echo $PATH
使用冒号进行分割PATH变量里面的条目,而不是windows里使用分号。

gcc -o exename codename.cpp 通过编译codename.cpp生成一个exename的应用程序
如果不写-o exename这个参数,则生成的应用程序为a.out
包含头文件 -I头文件目录
包含lib库 -L库目录 -l库名称

库名以lib开头,但是使用的时候未必是这个库的名字名。
比如libcurlXXX.xxx那么在包含的时候写-lcurl
.o 目标文件,一般是程序编译后的二进制文件,相当于VC的obj文件。
使用-c参数生成,一个代码文件生成一个对应的目标文件。
.a 代表静态函数库,相当于VC的lib文件。
静态库也称作归档文件(archive),可以通过ar和ranlib来生成。
ar命令可以把一个个目标文件添加到静态库文件的末尾去。
ranlib命令来对静态库的符号索引表进行更新。
.so 代表恭喜函数库,相当于VC的dll文件。

我主要使用kdevelop作为开发工具,真正直接使用gcc并不多。

二、shell程序设计

我们正常使用的都是/bin/bash这个shell
/bin/sh是一个link文件,链接到/bin/bash。

P17页的set -C 相当于 set -o noclobber 作用是不能覆盖文件了,如果覆盖文件,会出现“cannot overwrite existing file”的提示,并终止。
如果要恢复,则使用set +o noclobber恢复正常状态。

>可以将屏幕输入覆盖到文件,比如ll>123.txt
>>可以将屏幕输入追加到文件,比如ps>123.txt
<可以将文件内容输入给程序,比如more<123.txt 以more的形式在屏幕上输出。
2>可以将错误信息输入覆盖到文件,比如kill 9999999 2>123.err 此时如果使用>,那么文件会为空。
2>>可以将错误信息输入追加到文件。
如果要把标准输出和错误输出到同一个文件,要2>&1 比如 kill 9999999 >123.txt 2>&1
如果要丢弃输入,即不显示屏幕也不保存,可以写入回收站(/dev/null)比如 kill 9999999 >/dev/null 2>&1

| 即管道,可以实现多个命令同时运行,而且数据流在它们之间的传递可以自动进行协调。

脚本里如果运行程序,那么这是一个阻塞的过程,只有这个程序运行结束,才会执行下一条脚本语句。如果只是启动程序后要继续脚本操作,可以加上&参数后台运行。
(顺便说一下,如果执行应用程序给于参数是&,那么在main函数里获得的参数里是没有&这个参数的,如果&在中间,那么后面的参数全部无效,argc的参数数量也只记录&前面的参数。linux里获得的第一个参数和windows一样,都是应用程序的执行路径。区别是windows是绝对路径,linux只是启动命令,如"./test.exe")

以前一直以为./是执行应用程序用的命令,现在才知道./是把程序的完整路径告诉shell来执行,如果想不用./来执行应用程序,那么需要把该程序目录添加到$环境变量中去。

$for file * 可以显示当前目录文件的文件名和编码格式。

脚本的规则很烦人,对空格要求很严格,有时候多个空格不行,有时候少个空格也不行。
不能随便加空格,否则出错:
a1="123" #yes
a1空格="123" #error
a1=空格"123" #a1为空

有的地方空格必须加,否则出错:
if [ "$SHELL" = "/bin/bash" ];then
if [空格"$SHELL" = "/bin/bash"空格];then

[ -f "1.txt" ]&&{ echo ‘& yes‘;exit 1;}
[空格-f "1.txt"空格]&&{空格echo ‘& yes‘;exit 1;}分号必须加

特殊变量$# 表示包含自定义参数的个数,如果没有自定义参数则为0
$0表示脚本的名字(其实不准确,应该是启动这个脚本的命令,如"./test.sh" 。如果使用完整路径启动,那么就是具体的路径名+脚本名),不算在$#中。
$1表示传入的第一个参数。
$$这个脚本的进程号。

具体if指令见P27页,不能用大于小于号很让人郁闷。
if中的变量如果要进行比较,都要加上""双引号。

其他的用到再查书吧。

三、文件操作

linux几乎一切都是文件,可以用文件打开的方式使用网络连接,串行口等其它设备。

0 标准输入
1标准输出
2标准错误
可以使用write(1,"",n)或者write(2,"",n) ,read(0,buf,n)

size_t是无符号整型

read的第三个参数如果大于实际字符串长度,那么会把内存中的其它值一起读出来。

open返回的文件描述符是唯一的,如果2个程序打开同一个文件,那么会得到2个不同文件描述符,他们的写位置是相互独立的,会导致彼此覆盖。
3个必须制定的访问模式O_RDONLY,OWRONLY,O_RDWR ,如果都不写,则默认O_RDONLY 。
O_APPEND(追加写入,这个是默认的),O_TRUNC(打开时设置文件为空),O_CREAT(按照第三个参数创造文件,如果不给参数,则没有写入的权限即只读文件,即500权限,但是write可写,如果没有这个参数,则不能创造新文件。如果文件已经存在,则第三个参数无效),O_EXCL(与O_CREAT一起用,那么如果之前文件已经存在,则返回失败)

creat相当于没有第二个参数的open,自带第二个参数(O_CREAT,OWRONLY,O_TRUNC)只有写权限,从头开始写。

未必能按照mode参数来创造文件,因为用户掩码(umask)会改变这个结果。
如果要创造需要的权限,可以在文件创造后,使用chmod来改变权限。
输入umask可以查看系统设置的值。一般是0022,即限制用户组和其他用户的写权限。

lseek设置文件指针位置,3个参数SEEK_SET(从文件头偏移),SEEK_CUR(从当前位置偏移),SEEK_END(从文件尾偏移)

stat,fstat,lstat以及一系列用于判断的宏定义,见P88页,也可以man stat
如果打开一个符号连接,stat返回指向的文件,lstat指向打开的这个链接。

标准IO库和windows里的基本相同,都是ANSI C的一部分。

r+ w+ 都是拥有读写权限,同样都是从文件头开始写入。

chmod,fchmod改变文件权限。

unlink,link 都和命令行里的命令一致,建立新的硬链接。
symlink相当于命令行里的ln -s 一样,建立符号链接,相当于windows里的快捷方式。

mkdir,rmdir 创建、删除目录
chdir,getcwd 改变、获得当前的工作目录

扫描目录系列函数看一下P103的例子就行了。

错误处理在errno.h文件里,出现错误后使用errno,这是个整型,显示错误号。
strerror将这个错误号变成具体的描述。
或者用perror直接把最近的错误内容打印出来。
在目前的版本里这个不需要自己定义全局变量,只要包括errno.h文件就行,和windows的一样,获得最后一次错误,拥有线程保护的,放心用。

fcntl可以做很多底层的事情,记住这个函数,以后在具体例子中慢慢研究。

mmap,msync,munmap允许程序共享内存,通过带特殊权限的虚拟内存段的话还可以用在文件的处理上。
感觉用它来读取结构化的文件挺方便的,可以看看P111的例子,以后应该的可以用到的。

另外无论使用open还是fopen后,手动删除掉该文件,那么后面的write和fwrite都会返回成功,但实际都是失败的。

四、linux环境

程序传递的参数,前面提到过:
如果执行应用程序给于参数是&,那么在main函数里获得的参数里是没有&这个参数的,如果&在中间,那么后面的参数全部无效,argc的参数数量也只记录&前面的参数。
linux里获得的第一个参数和windows一样,都是应用程序的执行路径。区别是windows是绝对路径,linux只是启动命令,如"./test.exe"

getopt和getopt_long可以用来解析输入参数。

getenv,outenv用来获得和新增环境变量,注意这个新增只影响自己,不会返回到父进程,即shell里面去。

extern char **environ (以NULL为结尾的字符串数组)可以获得所有的环境变量。

时间和日期和windows上的基本一致。
strftime使用的格式化转换控制符看P126页。

临时文件用tmpnam(是nam不是name)返回一个唯一标识符,但是如果是多个进程可能是一样的,所以最好用tmpfile直接打开一个文件。注意当这个文件流指针本关闭后,该文件会自动删除。
注意tmpnam的输入参数也是返回值,所以输入参数需要是一个足够长的字符串变量。

用户信息和日志等需要的时候再细看吧,现在也不是很了解linux的系统。

五 终端

六 curses

时间: 2024-11-05 18:32:01

linux程序设计学习笔记(1-6)的相关文章

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

Linux 程序设计学习笔记----POSIX 文件及目录管理

转载请注明:http://blog.csdn.net/suool/article/details/38141047 问题引入 文件流和文件描述符的区别 上节讲到ANSI C 库函数的实现在用户态,流的相应资源也在用户空间,但无论如何实现最终都需要通过内核实现对文件的读写控制.因此fopen函数必然调用了对OS的系统调用.这一调用在LINUX下即为open, close, read, write等函数.这些都遵循POSIX标准. so,在linux系统中是如何通过POSIX标准实现对文件的操作和目

Linux程序设计学习笔记----System V进程间通信(信号量)

关于System V Unix System V,是Unix操作系统众多版本中的一支.它最初由AT&T开发,在1983年第一次发布,因此也被称为AT&T System V.一共发行了4个System V的主要版本:版本1.2.3和4.System V Release 4,或者称为SVR4,是最成功的版本,成为一些UNIX共同特性的源头,例如"SysV 初始化脚本"(/etc/init.d),用来控制系统启动和关闭,System V Interface Definitio

Linux程序设计学习笔记----进程间通信——管道

转载请注明出处: http://blog.csdn.net/suool/article/details/38444149, 谢谢! 进程通信概述 在Linux系统中,进程是一个独立的资源管理单元,但是独立而不孤立,他们需要之间的通信,因此便需要一个进程间数据传递.异步.同步的机制,这个机制显然需要由OS来完成管理和维护.如下: 1.同一主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO),消息队列(Message Queue)和共享内存(Share Memory).无名管道多用于亲

Linux 程序设计学习笔记----命令行参数处理

转载请注明出处.http://blog.csdn.net/suool/article/details/38089001 问题引入----命令行参数及解析 在使用linux时,与windows最大的不同应该就是经常使用命令行来解决大多数问题.比如下面这样的: 而显然我们知道C语言程序的入口是mian函数,即是从main函数开始执行,而main函数的原型是: int main( int argc, char *argv[] ); int main( int argc, char **argv );

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

Linux 程序设计学习笔记----Linux下文件类型和属性管理

转载请注明出处:http://blog.csdn.net/suool/article/details/38318225 部分内容整理自网络,在此感谢各位大神. Linux文件类型和权限 数据表示 文件属性存储结构体Inode的成员变量i_mode存储着该文件的文件类型和权限信息.该变量为short int类型. 这个16位变量的各个位功能划分为: 第0-8位为权限位,为别对应拥有者(user),同组其他用户(group)和其他用户(other)的读R写W和执行X权限. 第9-11位是权限修饰位,

Linux 程序设计学习笔记----动手编写makefile文件

Befroe Beginning. 之前定了暑假的plan ,关于Linux的书籍现在在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 现在开始关于Linux程序设计的第一篇学习笔记. 本来打算把名字写成教程,不过觉得自己完全是新手在自学,还是写学习笔记比较负责和适合. 希望可以一起学习进步. 引入 首先我们假设这样一个场景.我们有一个程序包含了三个文件,分别是源码文件main_plus,c和function_plus.c以及头文件mydefine_p