一、进程的ID :类型是pid_t 本质是unsigned int getpid()获取进程ID getppid()获取父进程的id
fork()函数创键一个进程 子进程完全复制了父进程的地址空间内容,包括数据段和堆栈段,但并不复制代码段,而是和父进程共用代码段
exit()函数退出进程
二、关于 标准输入标准输出 标准错误
在unix系统调用中,标准输入描述字用stdin,标准输出用stdout,标准出错用stderr表示,但在一些调用函数,引用了STDIN_FILENO表示标准输入才,同样,标准出入用STDOUT_FILENO,标准出错用STDERR_FILENO.
他们的区别:
stdin等是FILE *类型,属于标准I/O,在<stdio.h>。
STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有buffer的I/O,直接调用系统调用,在<unistd.h>。
三、
1、读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回。同样,写常规文件是不会阻塞的。
从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用read从网络读就会阻塞,至于会阻塞多长时间也是不确定的,如果一直没有数据到达就一直阻塞在那里。写也是一样的。
2、阻塞I/O的概念
现在明确一下阻塞(Block)这个概念。当进程调用一个阻塞的系统函数时,该进程被置于睡眠(Sleep)状态,这时内核调度其它进程运行,直到该进程等待的事件发生了(比如网络上接收到数据包,或者调用sleep指定的睡眠时间到了)它才有可能继续运行。与睡眠状态相对的是运行(Running)状态,在Linux内核中,处于运行状态的进程分为两种情况:
1、正在被调度执行。CPU处于该进程的上下文环境中,程序计数器(eip)里保存着该进程的指令地址,通用寄存器里保存着该进程运算过程的中间结果,正在执行该进程的指令,正在读写该进程的地址空间。
2、就绪状态。该进程不需要等待什么事件发生,随时都可以执行,但CPU暂时还在执行另一个进程,所以该进程在一个就绪队列中等待被内核调度。系统中可能同时有多个就绪的进程,那么该调度谁执行呢?内核的调度算法是基于优先级和时间片的,而且会根据每个进程的运行情况动态调整它的优先级和时间片,让每个进程都能比较公平地得到机会执行,同时要兼顾用户体验,不能让和用户交互的进程响应太慢。
3、pipe pipe函数创建管道 函数原型
int pipe(int fd[2]) 函数返回0表示成功 返回-1 表示失败 使用完毕记得close(pipe); // 文件描述符数组fd并没有和任何有名文件相关联
fd[0] 读出端 fd[1]写入端
此处插入关于man 命令的使用方法
数字"1"表示用户命令
数字"2"表示系统调用
数字"3"表示C语言库函数
四、关于线程
pthread_t tid;线程的ID
pthread_self()获得线程ID
pthread_create(,,,)//创建线程 四个参数
要在主线程中使用sleep(睡眠时间)使主线程休眠 才能让新创建的线程工作
或者 pthread_join(等待退出的线程号,NULL) 第一个参数表示需要去的结束信息的线程,如果该线程尚在运行中,那么该函数会导致调用线程的阻塞,知道指定线程结束执行为止。
进程的地址空间对于该进程创建的任意一个线程来说都是开放的