IO进程(3)

一:文件属性的获取

1.1:添加头文件:#include<sys/stat.h>

1.2:函数:int stat(const char *path, struct stat *buf);

功能:获取文件属性

参数:path:文件路径名

buf:保存文件属性信息的结构体

返回值:成功:0

失败:-1

1.3:结构体定义的变量

struct stat {
        dev_t    st_dev;       /* 设备ID */
        ino_t     st_ino;     /* inode号 */
        mode_t    st_mode;    /* 文件类型和权限 */
        nlink_t   st_nlink;   /* 硬链接数 */
        uid_t     st_uid;     /* 用户ID */
        gid_t     st_gid;     /* 组ID */
        off_t     st_size;    /* 大小 */
        time_t    st_atime;   /* 最后访问时间 */
        time_t    st_mtime;   /* 最后修改时间 */
        time_t    st_ctime;  /* 最后状态改变时间 */
    };

1.4:文件权限子网掩码简化方式:

 1.5:文件类型的判别方式

注释:通过头文件去跳转查看,如何用if...else判断

// 文件类型判断
        if ((st.st_mode & __S_IFMT) == __S_IFDIR)
            putchar('d');
        else if ((st.st_mode & __S_IFMT) == __S_IFLNK)
            putchar('i');
        else if ((st.st_mode & __S_IFMT) == __S_IFBLK)
            putchar('b');
        else if ((st.st_mode & __S_IFMT) == __S_IFSOCK)
            putchar('s');
        else if ((st.st_mode & __S_IFMT) == __S_IFCHR)
            putchar('c');
        else if ((st.st_mode & __S_IFMT) == __S_IFIFO)
            putchar('p');
        else if ((st.st_mode & __S_IFMT) == __S_IFREG)
            putchar('-');

二:目录操作

注释:围绕目录流进行操作,DIR *

1.1:头文件引入

#include<sys/types.h>
#include<dirent.h>

1.3:打开目录流以及读和关闭操作

DIR *opendir(const char *name);
功能:获得目录流
参数:要打开的目录
返回值:成功:目录流
       失败:NULL

struct dirent *readdir(DIR *dirp);
功能:读目录
参数:要读的目录流
返回值:成功:读到的信息    
      失败或读到目录结尾:NULL
返回值为结构体,该结构体成员为描述该目录下的文件信息

struct dirent {
        ino_t   d_ino;                   /* 索引节点号*/
        off_t   d_off;               /*在目录文件中的偏移*/
        unsigned short d_reclen;    /* 文件名长度*/
        unsigned char  d_type;      /* 文件类型 */
        char    d_name[256];      /* 文件名 */
};

int closedir(DIR *dirp);
功能:关闭目录
参数:dirp:目录流
1.4:读取目录操作
DIR *dir;//读目录
    struct dirent *d;
    dir = opendir(".");//打开目录
    if (dir == NULL) {
        perror("opendir");
        return -1;
    }

三:标准IO和文件IO的区别

标准IO

文件IO

概念

在C库中定义的一组输入输出的函数

在posix中定义的一组输入输出的函数

特点

  1. 有缓冲区,减少系统调用,提高效率
  2. 围绕流操作,FILE*
  3. 默认打开三个流:stdin\stdout\stderr
  4. 只操作普通文件
  1. 没有缓冲区,每次操作都引起系统调用
  2. 围绕文件描述符操作
  3. 默认打开三个文件描述符:0\1\2
  4. 除目录外其他文件

函数

打开文件fopen/freopen

关闭文件fclose

读写文件

文件定位rewind/fseek/ftell

打开文件open

关闭文件:close

读写文件

文件定位:lseek

四:库(本质上来说库是一种可执行代码的二进制形式

 1.2:库定义

linux.so .a windows.dll

cd /usr/lib

lib库文件

cd /usr/include

include头文件

由于windows和linux的本质不同,因此二者库的二进制是不兼容的

1.2:库的分类

静态库和动态库:本质区别是代码被载入时刻不同

1):静态库编译时会被连接到目标代码中

优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快

缺点:静态库中的代码复制到了程序中,因此体积较大;

静态库升级后,程序需要重新编译链接

2):动态库在程序运行时才会被载入代码

优点:程序在执行时加载动态库,代码体积小;

程序升级更简单;

不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例

缺点运行时还需要动态库的存在,移植性较差

1.3:库的制作

3.1:静态库

<1>:将源文件编译生成目标文件

gcc -c xx.c -o xx.o

<2>创建静态库用ar命令,将.o转换为.a

	ar crs libmyadd.a add.o

静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a

<3>测试使用静态库

	gcc main.c -L.	-lmyadd		// -L指定库的路径 	-l指定库名
	执行:./a.out
3.2:动态库的制作

<1>gcc创建共享库

gcc -fPIC  -c hello.c  -o hello.o 
-fPIC 创建与地址无关的编译程序  (就是不和路径进行关联)
gcc  -shared  -o  libmyhello.so  hello.o

<2>测试动态库使用

gcc main.c  -L. -lmyhello

注释:如果编译时通过,运行报错

1:(1)把库拷贝到/usr/lib和/lib目录下(此方法编译时不需要指定库的路径)

2:在LD_LIBRARY_PATH环境变量中加上库所在路径。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

(终端关闭,环境变量就没在了)

3:添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新

sudo vi xx.conf

添加动态库存在的路径使用绝对路径

1.3:如何使用库?

将库文件放到系统目录/usr/lib  或 /lib
	将头文件放在系统目录/usr/include
		#include <xx.h>
		如果头文件在当前目录
		#include  "xx.h"
		如果头文件在其他目录
			#include "头文件路径/xx.h"
			(如果我没有指定路径的话可以使用 gcc)
			#include  "xx.h"
			gcc   xx.c  -I 头文件的路径
	-L 路径:指定库的路径
       -l:(L的小写)指定库名
	-I 路径:(i的大写)指定头文件路径

五:进程

5.1:进程和程序的区别

程序:编译好的可执行文件

存放在磁盘上的指令和数据的有序集合(文件)

程序是静态的,没有任何执行的概念

进程:一个独立的可调度任务

执行一个程序所分配的资源的总称

进程是程序的一次执行过程

进程是动态的,包括创建、调度、执行和消亡

5.2:特点

  1. 系统会为每个进程分配0-4g的虚拟空间,其中0-3g是用户空间,每个进程独有;3g-4g是内核空间,所有进程共享
  2. 轮转调度:时间片,系统为每个进程分配时间片(几毫秒~几十毫秒),当一个进程时间片用完时,CPU调度另一个进程,从而实现进程调度的切换 (没有外界干预是随机调度)
 5.3:进程段

Linux进程包含3

"数据段" 存放的是全局变量、常数以及动态数据分配的数据空间(如malloc函数取得的空间)等。

"正文段" 存放的程序代码

"堆栈段" 存放的是函数的返回地址、函数的参数以及程序中的局部变量

5.4:进程的分类

5.4.1:

交互进程:类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以在后台运 行。该类进程经常与用户进行交互,需要等待用户的输入,当接收到用户的输入后,该类 进程会立刻响应,典型的交互式进程有:shell命令进程、文本编辑器等

批处理进程该类进程不属于某个终端,它被提交到一个队列中以便顺序执行

守护进程:该类进程在后台运行。它一般在Linux启动时开始执行,系统关闭时才结束

5.5:进程状态(man ps)

1)运行态(TASK_RUNNING):R

指正在被CPU运行或者就绪,running进程。

2)睡眠态(等待态):

可中断睡眠态(TASK_INTERRUPTIBLE)S:处于等待状态中的进程,一旦被该进程等待的资源被释放,那么该进程就会进入运行状态。

(只能通过特定的函数进行唤醒,是不能随便去中断的)

不可中断睡眠态(TASK_UNINTERRUPTIBLE)D:该状态的进程只能用wake_up()函数唤醒。

3)暂停态(TASK_STOPPED):T

当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号让进程转换到可运行状态。

4)死亡态:进程结束 X

5)僵尸态:Z 当进程已经终止运行,但还占用系统资源,要避免僵尸态的产生

< 高优先级

N 低优先级

s 会话组组长

l 多线程

+ 前台进程

六:进程状态切换图

6.1:文字描述:

进程创建后,进程进入就绪态,当CPU调度到此进程时进入运行态,当时间片用完时,此进程会进入就绪态,如果此进程正在执行一些IO操作(阻塞操作)会进入阻塞态,完成IO操作(阻塞结束)后又可进入就绪态,等待CPU的调度,当进程运行结束即进入结束态。

6.2:图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值