学习 Linux高级编程03
来源:互联网 发布:自助建站 源码 编辑:程序博客网 时间:2024/06/11 16:22
AM
一、make与makefile
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.使用write向0 1 2写数据
2.使用read从0 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写?
答案:不允许
- 学习 Linux高级编程03
- 学习 Linux高级编程01
- 学习 Linux高级编程02
- linux高级编程学习网址
- Linux高级编程学习资料
- 学习 Linux高级编程05_A
- 学习 Linux高级编程05_B
- 学习 Linux高级编程06_A
- 学习 Linux高级编程06_B
- 学习 Linux高级编程07_A
- 学习 Linux高级编程07_B
- 学习 Linux高级编程08_A
- 学习 Linux高级编程08_B
- 学习 Linux高级编程09_A
- 学习 Linux高级编程09_B
- 寒假学习 第四、五天 (linux 高级编程)
- c++ 学习笔记(高级linux编程) day1
- c++ 学习笔记(高级linux编程) day2
- JS cookie
- HTML之iframe
- 浅谈UML中聚合和组合
- EPATHOBJ 提权源码
- OpenCV基础知识
- 学习 Linux高级编程03
- Linux netstat命令
- 文件复制,删除
- 图解 MongoDB 地理位置索引的实现原理
- MySQL中UNION和UNION ALL的使用
- CentOS Linux自动备份文件到远程FTP服务器并删除指定日期前的备份Shell脚本
- MYSQL 分享:最快速度将字符串进行分割以表的方式进行展示
- chekbox全选全不选
- 使用Alter,Change,After修改MySQL表中字段名的排序