原创 读书笔记

2011-3-14 12:57 1526 7 7 分类: 工程师职场

C语言与Unix系统编程

第一章
外壳程序
常用外壳程序内部命令
alias创建一个别名
cd改变目录
pwd打印当前工作目录
set给一个外壳程序变量赋值
which标示程序的完整路径

某些常用的系统程序
grep针对指定文本检索文件
ls列出文件和它们的属性
man显示帮助信息
more通过暂停滚动方式显示文本内容
time测量程序的运行时间
sort在一个文本文件中对文本进行排序
wc对词行字符统计
diff比较两个文件

调试器
gcc sum.c
//a.out

gcc -g sum.c
//a.out

gdb.out
break 13
run
display i
where
step
next
continue

gcc -o crash1 crash1.c
ctrl+c强制结束程序的执行

第四章指针和结构
静态分配内存,栈,程序运行时一直占有,程序结束后即释放
动态分配内存,堆,必须由程序员进行释放
#include <stdlib.h>
double *a;
a=(double *) malloc (40);
40个字节,5个double
free(a)

第5章输入输出
stream
c语言标准库函数:fopen,fclose,fread,fwrite
系统函数:open,close,read,write
printf,scanf,fprintf,fscansf
stdin,stdout,stderr

管道
<标准输入流来自给定文件
>标准输出流被发送到给定文件
|前面的输出作为后面的输入

第6章程序管理
程序建立
预处理、汇编代码、目标代码、库。
main.c-(compile)->main.o-(link)->main.out
                  libc.a-(link)->main.out

库动态链接
库静态链接:
gcc -static main.c sqrt.c

编译:源代码转换为目标代码文件,预处理、编译、汇编。
#include <stdio.h>
#define PI 3.14
int main(int argc,char *argv[])
{
printf("PI = % 1f\n",PI);
}
gcc -E pre1.c
-E在预处理之后停止了编译处理
gcc -E pre1.c -o temp.c
gcc temp.c//预处理之后文件

gcc -S pre3.c
-S在编译之后停下,生成.s文件
ls pre3.*

在什么阶段停止 gcc标志 输出  
预处理   -E  修改后的源文件
编译     -S  汇编代码(.s)
汇编     -c  目标代码(.o)
链接         可执行文件(.out)


makefile:依赖关系和命令
file:dependency
[TAB]command
[TAB]command

程序分派最基本工具为档案(archieve):ar,tar
ls
main.c Makefile sqrt.c
tar cf dist.tar *//tar用来创建一个名为dist.tar的存档文件,包含了当前目录中的所有文件
ls
dist.tar main.c Makefile sqrt.c

tar tf dist.tar
gzip提供压缩和解压缩功能


第8章库
使用库:1包含一个或者多个头文件2库必须被链接到可执行程序
#include<stdio.h>
#include<math.h>
main()
{
double x,s;
s=8.0;
=sqrt(s);
printf("%lf\n",x);
}
gcc -o sq sq.c -lm
-lm告诉编译器链接(-l)一个名叫m的库文件。
头文件包含了库中所有函数的声明和一些宏定义等
unix中c标准库的头文件通常存储在/usr/include/
windows:c:\program files\microsoft visual stdio\vc98\inlcude
gcc -o sq sq.c -I/usr/include/mathlib -lm
选项-I/usr/include/mathlib告诉编译器对任何需要的包含文件,除了标准位置外,还需要查找目录/usr/include/mathlib。

库文件
lib名称.a
windows:c:win\system32,c:\win\system,lib子目录,以lib,dll结尾

X库一般存储在/usr/X11R6,它包含/usr/X11R6/include, /usr/X11R6/lib
gcc -o xprog1 xprog1.c -lX11 -L/usr/X11R6/lib
-L/usr/X11R6/lib告诉编译器将路径usr/X11R6/lib添加到用于查找库文件的目录集合中去。

stdio.h:输入输出函数
stdlib.h:多种类的函数,包括内存分配函数
string.h:字符串
math.h:数学函数
time.h:时间日期

ar将目标代码文件打包成一个库文件
ar r libcustomer.a larage.o two.o//将larage.o two.o生成libcustomer.a
ar t libcustomer.a//查看libcustomer.a中的内容
自己库的使用
gcc -o testpro testpro.c -lcustom -L
-lcustom告诉编译器链接到库文件libcustomer.a,-L告诉编译器除了在通常的系统库路径外,还需要在当前目录中检索库。

第7章系统调用
process
ps
ps -ef
----------
ctrl+c:终止当前连接到stdin的进程

&:在后台运行程序,断开stdin流的连接
ctrl+z:挂起连接到stdin的进程
bg:重新启动挂起的进程,stdin仍然断开
fg:将挂起/后台运行的程序重新连接到stdin

kill:终止给定ID的进程
----------
fork()
系统调用它创建当前运行程序的一个克隆。原来的程序会继续运行fork()函数调用之后的下一个代码。
克隆体也会在下一行代码处启动之行。
#include <stdio.h>
#include <unistd.h>
main()
{
int i;
printf("Ready to fork..\n");
i=fork();
printf("Fork returned %d\n",i);
while(1);
}

#include <stdio.h>
#include <unistd.h>
main()
{
int i;
printf("Ready to fork..\n");
i=fork();
if(i==0)
{
printf("Child process\n");
printf("Child j=10\n");
}
else
{
printf("Parent process\n");
printf("Parent j=3\n");
}
}


exec()
用另外一段代码替换进程中当前正在执行的代码。
#include <stdio.h>
#include <unistd.h>
main()
{
char program[80],*arg[3];
int i;

printf("Ready to exec()...\n");
strcpy(program,"data");
args[0]="data";
args[1]="-u";
args[0]=NULL;
i=execvp(program,args);
printf("i=%d...did it work?\n",i);
}


wait()
挂起一个进程,等待一个子进程完成,可以协调父子进程。

system(),fork(),exec(),wait()

----------
信号系统调用
进程间通信(IPC)
列出信号:
man 7 signal
kill -l
/usr/include/signal.h

signal()为一个给定的信号安装一个信号处理函数.
//SIGFPE浮点数字异常
#include <stdio.h>
#include <signal.h>
main()
{
void f(int);
int i;

signal(SIGFPE,f);
for(i=0;i<=3;i++)
printf("%d\n",12/i);
}

void f(int signum)
{
printf("You can not divide by zero!\n");
exit(SIGFPE);
}


----------
kill()

#include <stdio.h>
#incldue <unistd.h>
#include <signal.h>

int running;
main()
{
void f(int);
int i,j;
char text[80];

i=fork();
if(i==0)
{
signal(SIGUSR1,f);
printf("child waiting ...\n");
running =1;
while(running==1)
sleep(1);
}
else
{
while(1)
{
sleep(1);
printf("command?");
scanf("%s",text);
if(strcmp(text,"frog" == 0)
kill(i,SIGUSR1);//将发送给子信号
if(strcmp(text,"quit" == 0)
break;
}
}
}
}

void f(int signum)
{
printf("chindl received a frog\n");
running=0;
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条