《Beginning Linux Programming》读书笔记(四)

1,读写空指针

先看第一种情况,printf试图访问空指针,以打印出字符串,而sprintf试图向空指针写入字符串,这时,linux会在GNU C函数库的帮助下,允许读空指针,但不允许写空指针。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> #include < unistd.h >
#include
< stdlib.h >
#include
< stdio.h >

int main()
{
char * some_memory = ( char * ) 0 ;
printf(
" Areadfromnull%s/n " ,some_memory);
sprintf(some_memory,
" Awritetonull/n " );
exit(EXIT_SUCCESS);
}

再来看第2种情况,直接读地址0的数据,这时没有GNU libc函数库在我们和内核之间了,因此不允许执行。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> #include < unistd.h >
#include
< stdlib.h >
#include
< stdio.h >

int main()
{
char z = * ( const char * ) 0 ;
printf(
" Ireadfromlocationzero/n " );
exit(EXIT_SUCCESS);
}

2,今天看到400页了,做个小结。第三章文件和目录,第四章参数,选项处理和环境变量,第五章和第六章都是终端的编程,第7章内存管理和文件加锁机制,包括整个文件封锁和部分区域封锁,第八章MySQL跳过不看,

3,使用make命令就可以完成编译,修改某些源码后再次make就可以编译修改部分与其他引用到的文件。下面是最简单的一个示例:

main.c

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> #include < stdio.h >
#include
" hello.h "

int main()
{
printf(
" hi,firstline/n " );
sayHello();
return 0 ;
}

hello.h

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> void sayHello();

hello.c

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> #include " hello.h "

void sayHello()
{
printf(
" hello,world/n " );
}

Makefile

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> helloworld:main.ohello.o
gcc
- ohelloworldmain.ohello.o
main.o:main.chello.h
gcc
- cmain.c - omain.o
hello.o:hello.chello.h
gcc
- chello.c - ohello.o
clean:
rm
- rf * .ohelloworld

执行

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> make
.
/ helloworld
makeclean

4,对上面Makefile的第一个改进版本

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> OBJFILE = main.ohello.o
CC
= gcc
CFLAGS
= - Wall - O - g

helloworld:$(OBJFILE)
$(CC)
- ohelloworld$(OBJFILE)
main.o:main.chello.h
$(CC)$(CFLAGS)
- cmain.c - omain.o
hello.o:hello.chello.h
$(CC)$(CFLAGS)
- chello.c - ohello.o
clean:
rm
- rf * .ohelloworld

5,对上面Makefile的第二个改进版本

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> CC = gcc
CFLAGS
= - Wall - O - g
TARGET
= . / helloworld

% .o: % .c
$(CC)$(CFLAGS)
- c$ < - o$@
SOURCES
= $(wildcard * .c)
OBJFILE
= $(patsubst % .c, % .o,$(SOURCES))
$(TARGET):$(OBJFILE)
$(CC)$(OBJFILE)
- o$(TARGET)
chmoda
+ x$(TARGET)
clean:
rm
- rf * .o$(TARGET)

6,上面Makefile的第三个改进版本,加入install功能

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> #whichcomplier
CC
= gcc
#
where toinstall
INSTDIR
= / usr / local / bin
#
where areincludefileskept
INCLUDE
= .
#options
for dev
CFLAGS
= - Wall - O - g

TARGET
= . / helloworld

% .o: % .c
$(CC)$(CFLAGS)
- c$ < - o$@
SOURCES
= $(wildcard * .c)
OBJFILE
= $(patsubst % .c, % .o,$(SOURCES))
$(TARGET):$(OBJFILE)
$(CC)$(OBJFILE)
- o$(TARGET)
chmoda
+ x$(TARGET)
clean:
rm
- rf * .o
install:$(TARGET)
@if[
- d$(INSTDIR)];/
then/
cp$(TARGET)$(INSTDIR);/
chmoda
+ x$(INSTDIR) / $(TARGET);/
chmodog
- w$(INSTDIR) / $(TARGET);/
echo
" installedin$(INSTDIR) " ;/
else /
echo
" sorry,$(INSTDIR)doesnotexist " ;/
fi

执行:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> makeinstall
makeclean

参考资料:

1,《Linux平台Makefile文件的编写基础篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值