C 高级编程4 makefile 与 IO

make 与 makefile
1.目标的语法
    目标名:依赖目标
      @命令
      @命令
    make的命令行使用
    make -f make 脚本文件 目标名

2.目标的划分
demo.mk
demo:
    gcc -c -fpic input.c
    gcc -c -fpic primer.c
    gcc -shared -olibdemo.so input.o primer.o
    gcc demo.c -ldemo -L. -omain

转变为   

demo1.mk:
compile:
    gcc -c -fpic input.c
    gcc -c -fpic primer.c
link:complie
    gcc -shared -olibdemo.so input.o primer.o
demo:link
    gcc demo.c -ldemo -L. -omain

<compile link 是不存在的文件,不存在就是最新的>

make -f demo1.mk compile
make -f demo1.mk link
make -f demo1.mk demo  

3.默认目标
   a.不指定目标,执行第一个目标
    make -f demo1.mk
    等介于make -f demo1.mk compile

   b.不指定make 文件,默认文件是makefile ,Makefile, makefile优先加载
     make

  目标的调用规则
      make执行目标:(make把 目标 当作文件)
        搜索与目标相同的文件
        如果文件存在,则判定日期.
        日期最新,则停止执行,输出提示
        日期不是最新,则进行执行.
        没有依赖就是最新的目标文件,不编绎

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

demo2.mk:
//跟据编译结果文件依赖,make就可以对实际存在的文件时间比较,决定编译进程
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. -odemo
clean:
    rm -rf *o demo *.so *a 

5.建义:
   只要有文件输出,就把任务作为一个目标,并把输出的文件作为目标名

6.潜规则(不建议)
   注释符号 #
   .C目标与.O目标
   查找.O目标,目标不存在,就把.O替换成.C
   如果.C存在,实施潜规则:直接调用GCC 把.C执行为.O

demo3.mk:
//跟据编译结果文件依赖,make就可以对实际存在的文件时间比较,决定编译进程
#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. -odemo
clean:
    rm -rf *o demo *.so *a 

7.定义变量

变量名=值1 值2
$(变量名) ${变量名}

demo4.mk:
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 input.o primer.o
demo:demo.c libdemo.so
    gcc demo.c -ldemo -L. -odemo
.PHONY:clean
clean:
    rm -rf *o demo *.so *a
    echo ${PATH}  //环境变量
    echo $(PATH) 

8.伪目标
     不把目标当成文件处理的
     声明伪目标
     .PHONY:clean

没有讲的:
   1.make的配制
   2.make变量的操作函数
   3.多make文件使用

二.环境变量

 env.c

int main(int args,char *argv,char **arge)
 {
   while(*arge)
   {
       printf("%s\n",*arge);
       arge++;

   }    

 }

 arge** ---->char*------>内容
             char*
              0
makefile

env:env.c
    gcc env.c -omain
clean:
    rm -rf main *.o

 命令行参数 argv与环境行arge都是字符串数组
 约定:最后一个字符串是NULL/0

2.在C的标准库提代了一个外部变量
#include <stdio>
#include <unistd.h>
void main(){
    extern char **environ
    while(*environ)
    {
        printf("%s\n,*environ")
        *environ++
    }
}
 make env
 ----------------------------------------------
 3.取环境变量的值
   getenv
   setenv
   unsetenv

   #include <unistd.h>
   #include <stdlib.h>
   #include <stdio.h>
   main()
   {
       char *val=getenv("PATH");
       printf("%s",val);
   }

 三.IO的认识
     1.认识内核对象
          不允许访问内核算设备和内存
          但可以通过内核系统函数去访问
          对每个内核对象进行编号ID.
          如果访问内核算对象,只能通过ID

          编程模型:
            申请得到一个ID
            在内核系统函数中使用ID得到对应内核对象

     2.如何访问文件:
          使用函数,传递一个文件,系统打开文件,加载文件返加一个ID
          使用函数,传递ID,得到数据
          使用函数传ID,告诉系统释放文件

          ID:文件描述符号.(fd)
          每个程序执行的时候都有一个目录,存放打开的文件的描述符

          #include <stdio.h>
          #include <stdlib.h>
          main()
          {
              printf("%p",getpid());
              while(1);

          }

          cd /proc/25857/fd
          ls

    ::每个程序可打开三个设备(0,1,2)
          0:标准输入
          1:标准输出
          2:错误输出

   4.操作文件描述符号
       sszie_t write(int fd, void * buf,size_t size);
       返回:
          >0 实际写入的数据
          -1 写入错误
       ssize_t read(int fd, void *buf ,size_t size);
       返回:
         >0:实际读取的数据
         =0:碰到文件结束符号EOF ctrl+d
         -1:读取错误

      #include <stdio.h>
      #include <stdlib.h>
          main()
          {

              while(0,"HELLO\n",6);
              while(1,"world\n",6);
              while(2,"louis\n",6);
          }       

       建议:
           0:输入
           1:输出
           2:错误

     #include <stdio.h>
     #include <stdlib.h>
          main()
          {

              while(0,"HELLO\n",6);
              while(1,"world\n",6);
              while(2,"louis\n",6);
              int a=20;
              write(1,&a,4);
          }
       乱码:

    #include <stdio.h>
    #include <stdlib.h>
          main()
          {
              char buf[30];
              int r=read(0,buf,30);
              printf("youput:%d\n",r);
              if(r>0)
              {
              buf[r]=0;
              printf("::%s\n",buf);
              }
              if(r==0)
              {

                  printf("ctrl+d\n");
              }
              if(r==-1)
              {

                  printf("error\n");
              }

          }
时间: 2024-10-14 21:47:42

C 高级编程4 makefile 与 IO的相关文章

《UNIX环境高级编程》--5 标准IO库

标准IO库 流和 FILE对象 标准IO库与文件IO区别: 标准IO库处理很多细节,如缓冲区分片.以优化的块长度执行IO等. 文件IO函数都是围绕文件描述符进行.首先打开一个文件,返回一个文件描述符:后续的文件IO操作都使用该文件描述符 标准IO库是围绕流进行的.当用标准IO库打开或者创建一个文件时,就有一个内建的流与之相关联 标准IO库的函数很多都是以 f开头,如fopen.fclose 对于ASCII字符集,一个字符用一个字节表示:对于国际字符集,一个字符可以用多个字节表示. 标准IO文件流

(十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO

. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)

Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APU

(十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)

. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)

(十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)

(九) 一起学 Unix 环境高级编程 (APUE) 之 线程

. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)

(七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系

(六) 一起学 Unix 环境高级编程(APUE) 之 进程控制

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 上一篇博文中我们讨论了进程环境,相信大家对进程已经有了初步的认识

Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Python高级编程和异步IO并发编程,把每个Python高级知识点从起因到原理讲透的课程全网难寻 第1章 课程简介第2章 python中一切皆对象第3章 魔法函数第4章 深入类和对象第5章 自定义序列类第6章 深入python