学习 Linux高级编程03

来源:互联网 发布:自助建站 源码 编辑:程序博客网 时间:2024/06/11 16:22

AM

 

一、makemakefile

         1.回顾:

                   目标的语法

                   目标名:依赖目标

                            @命令

                            @命令

                   make的命令行使用

                            make-f make脚本文件目标名

         2.目标的划分

                   目标依赖

         3.默认规则:

                   a.不指定目标,默认执行第一个目标

                   b.不指定make文件,默认文件是makefile或者是Makefile(makefile优先)

         4.目标的调用规则:(make把目标当作文件)

                   make执行目标:

                            搜索与目标相同的文件

                            如果文件存在,则判定日期。

                                    日期最新,则停止执行,输出提示

                            日期不是最新,则进行执行

                            比较:当前目标与依赖目标

                                    如果当前目标有

         5.建议:

                   只要有文件输入出,就把任务作为一个目标,并且把输出的文件作为目标名。 ==

                   每一个编译结果作为一个目标,并且把编译结果作为目标名。

         6.潜规则(不建议)

                   .c目标与.o目标

                   首先查找.o目标,目标如果不存在,就把.o替换成.c

                   如果.c存在,实施潜规则:直接调用gcc.c执行为.o

         7.变量

                   变量名=值值

                   $(变量名) ${变量名}变量名可以是用户定义的也可以是环境变量

         8.伪目标

                   不把目标作为文件处理的目标称为伪目标

                   声明伪目标:.PHONY:clean

没有:

         1.make的配置

         2.make的变量的操作函数

         3.make文件使用

 

二、环境变量

         访问环境变量的方式:

         1.使用main的参数

         intmain(int args, char **argv, char **arge)

         {

         }

         二维数组循环

                   命令行参数argv与环境行arge都是字符数组。

                   约定:最后一个字符串实际上是NULL/0

         2.C的标准库提供:外部变量

                   externchar **environ;

         3.修改获取某个环境变量

                   getenv/setenv/unsetenv

        

三、IO的基础

         1.认识内核对象

                   不允许访问内核设备和内存,

                   但可以通过内核系统函数去访问。

                   对每个内核对象进行编号ID

                   如果访问内核对象,只能通过ID

                   编程模型:

                            申请得到一个ID

                            在内核系统函数中使用ID得到对应内核对象数据

         2.怎么访问文件

                   使用函数,传递一个文件,系统打开文件,加载文件数据,返回一个ID,

                   使用函数,传递一个ID,得到数据

                   使用函数传递ID,告诉系统释放文件。

                   ID:文件描述符号。 filedescription(fd)

                   每一个程序执行的时候都有一个目录,存放打开的文件描述符

         3.每个程序默认打开三个文件设备 (cd /proc/25967/fd/) fd

                   0:标准输入

                   1:标准输出

                   2:错误输出

         4.操作文件描述符

                   ssize_twrite(int fd,

                                               void*buf, //要写入内核对象的数据

                                               size_tsize,) //写入数据的大小

                            返回值:

                                     >0实际写入的数据

                                     =-1写入错误

                   ssize_tread(int fd,

                                               void*buf, //返回数据的空间

                                               size_tsize); //空间大小

                            返回值:

                                     >0:实际读取的数据

                                     =0:碰到文件结束符号EOF(CTRL+D)

                                     =-1:读取错误

                   建议:

                            0:输入

                            1:输出

                            2:错误输出

课堂练习:

         1.使用write0 1 2写数据

         2.使用read0 1读取数据,并判定输入的情况,然后根据相应的结果输出提示

        

PM

 

三、基于文件的描述符号

         1.得到文件描述符号/释放文件描述符

                   a.文件类型

                            目录文件 d

                            普通文件 f

                            字符设备文件 c

                            块设备文件 b

                            软连接文件 l(符号连接文件)

                            管道文件   p

                            socket文件 s

                   b.文件的属性

                            1.字符表达方式:字符模式: chmodu+w aa.c绝对方式 chmod 777 aa.c

                                     0       0                0                0

                                              拥有者                  其他用户

                            2.文件的权限属性:

                                    

                                    

                                    执行

                                    占附位权限

                                    用户设置权限

                                    组设置权限

                                     0       0                          0                0                0

                                              特殊权限         拥有者                  其他用户

                                     s:

                                     S:

                                     t:

                                     T:

                            2.1s设置位

                                               2:组设置位

                                               4:用户设置位

                                     s对执行文件

                                    无效的设置位使用S表示

                                    设置位向其他用户开放拥有者权限的权限,用户设置位

                                    设置位向其他用户开放组用户权限的权限,组用户设置位

                                    设置位只对执行程序有意义(执行权限有意义)

                            2.2t设置位

                                               1:表示沾附位设置

                                                        t对写文件有意义

                                              无效的沾附位使用T表示

                                    沾附的目的:防止有权限的用户删除文件

                            程序在执行的时候到底拥有的是执行者的权限,还是文件拥有者的权限。

                                    程序执行过程中有两个用户:

                                              实际用户:

                   c.     

         2.通过文件描述符号读写数据

         3.文件的概念与重定向

 

Demo.mk

compile:

         gcc  -c -fpic input.c

         gcc  -c -fpic primer.c

lnk: compile

         gcc  -shared -olibdemo.so input.o primer.o

demo:lnk

         gcc  demo.c -ldemo -l -omain

Make –f demo.mk demo

 

 

Makefile文件中的变量

makefile

input.o: input.c

         gcc  -c -fpic input.c

primer.o: primer.c

         gcc  -c -fpic primer.c

libdemo.so: input.o primer.o

         gcc  -shared -olibdemo.so input.o primer.o

demo:demo.c libdemo.so

         gcc  demo.c -ldemo -l -omain

makefile

OBJ=input.o primer.o

 

input.o: input.c

         gcc  -c -fpic input.c

primer.o: primer.c

         gcc  -c -fpic primer.c

libdemo.so: $(OBJ)

         gcc  -shared -olibdemo.so $(OBJ)

demo:demo.c libdemo.so

         gcc  demo.c -ldemo -l -omain

 

Env.c

#include<stdio.h>

int main(int args, char **argv, char  **arge)

{

         while(*arge)

         {

                   printf("%s\n",  *arge);

                   arge  ++

         }

}

env: env.c

         gcc  env.c -omain

 

clean:

         rm  -f main *.o

Env2.c

#include<stdio.h>

int main(int args, char *argv[], char  *arge[])

{

         int  i = 0;

         while(arge[i])

         {

                   printf("%s\n",  arge[i]);

                   i  ++;

         }

}

Env3.c

#include<stdio.h>

#include<unistd.h>

extern char **environ;

int main()

{

         while(*environ)

         {

                   printf("%s\n",  *environ);

                   environ  ++

         }

}

 

Fd.c

#include<stdlib.h>

#include<stdio.h>

 

main()

{

         printf("%d\n",  getpid());

         while(1);

}

执行结果

 

Write1.c

#include<stdlib.h>

#include<stdio.h>

 

main()

{

         write(0,"Hello\n",  6);

         write(1,"world\n",  6);

         write(2,"louis\n",  6);

}

 

Read1.c

#include<stdlib.h>

#include<stdio.h>

 

main()

{

         char  buf[32];

         int  r = read(0, buf, 30);

         printf("实际输入:%d\n",r);

         if(r  > 0)

         {

                   buf[r]=0;

                   printf("::%s\n",  buf);

         }

         if(r  == 0)

         {

                   printf("ctrl+d\n");

         }

         if(r  == -1)

         {

                   printf("输入错误");

         }

 

}

 

Chmod

 

 

Main

a.txt

Rwx

Rw

X

r

问题:当张执行main时能否对a.txt写?

答案:不允许

 

 

原创粉丝点击