Linux 学习第一天之进程间的通信

一、进程的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)   第一个参数表示需要去的结束信息的线程,如果该线程尚在运行中,那么该函数会导致调用线程的阻塞,知道指定线程结束执行为止。

进程的地址空间对于该进程创建的任意一个线程来说都是开放的

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值