linux 进程 线程

一 .进程

1.进程是什么

1.进程是程序的一次动态执行过程

2.进程是程序执行资源管理的最小单位

2.进程的特点

每一个进程都有一个0-4g 的虚拟内存

3.查看进程

ps axj

ps aux 

pstree

top

4.进程

二.进程的类型

1.交互进程 :可以在前台运行,也可以在后台运行

2.批处理进程 :不属于终端,在队列中顺序执行

3.守护进程 :在后台运行,在系统开启时运行,系统关闭结束

三.进程的运行状态

1.运行态:

2.等待态

3.停止态

4.僵尸态

5.死亡态

四.相关的系统调用

1.创建进程:

#include <sys/types.h>
#include <unistd.h>
 pid_t  fork(void);

2.改变进程优先级:

nice-按用户指定的优先级运行进程

renice -改变正在运行进程的优先级

3.获取当前的进程号

#include <sys/types.h>
#include <unistd.h>
getpid();   获取子进程
getppid();  获取父进程

4.进程退出

#include <stdlib.h> (exit所需的)
#include <unistd.h>  (_exit所需的)
exit(int status);   会刷新缓冲区
_exit(int status);  不会刷新

5.进程回收

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

(阻塞)
wait(int * status); 参数:进程退出时的状态



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

(阻塞或非阻塞)
waitpid(pid_t pid,int *status,int options);
参数:1:-1  等待任何一个子进程退出
      2:参数退出时的状态
      3:一般WNOHANG

6.exec函数族

 五.守护进程

1.守护进程特点:

1)系统开启时开始运行,系统关闭时结束运行

2)后台进程,与终端无关

2.守护进程的创建步骤:

1.创建进程,父进程退出

2.创建新的会话

3.改变当前目录为根目录

4.改变文件的权限掩码

5.关闭文件描述符

 六.进程的通信

1.无名管道

创建无名管道:

#include<unistd.h>
int pipe(int fd[2]);

2.有名管道

创建有名管道:

#include <unistd.h>
#include <fcntl.h>
#include <sys/types>

mkfifo(const char * filename,mode_t mode);
参数:1.要创建的管道
      2.权限

3.信号:

信号安装函数:

#include <signal.h>

void( *signal(int signum,void(*handler)(int))) (int);

参数: 1.signum 指定的信号
      2.handler: 
               SIG_IGN :忽略该信号   
               SIG_DEL:采用系统默认的方式处理信号
               自定义的信号处理函数指针

alarm闹钟函数

#include<unistd.h>
 int alarm(unsigned int seconds); 参数:秒数

pause挂起函数;

#include <unistd.h>
 int pause(void);

kill 发送信号

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

int kill(pid_t ,int sig);  函数参数:1.进程号  2. 信号

raise 给进程自己发信号

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

int raise(int sig);

七.共享内存

1.创建/打开共享内存

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

key_t key=ftok(".",23); 

shmget(key_t key,int size,int shmflg);
获取的是共享内存标识符
函数参数:1.ftok的返回值
          2.共享内存区的大小
          3.权限

2.映射共享内存

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
 
 shmat(int shmid,const void * shmaddr,int shmflg);
参数:1. 要映射的共享区内存标识符
      2.将共享内存映射到指定地址,NULL 系统自动完成映射
      3. 默认0 可读写

3.撤销共享内存的映射

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

shmdt(const void * shmaddr);参数:共享内存映射后的地址

4.删除共享内存对象

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

shmctl(int shmid,int cmd,struct shmid_ds *buf);
参数:1.要操作的共享标识符
      2.IPC_STAT 获取对象属性
        IPC_SET  设置对象属性
        IPC_RMID  删除对象
      3.指定IPC_STAT/IPC_SET时可以用以保存/设置属性

八.有名信号量

1.创建有名信号量:

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>

sem_open(const cahr *name,int oflag);
sem_open(const char *name,int oflag,mdoe_t mode,unsigned int value);
函数参数:1.信号量的名字
         2.打开的标志,O_RDWR  ,O_CREAT传入这个,才会有后两个参数
         3.权限 0666
         4.信号量初值

sem_wait();p操作 -1
sem post();v操作 +1

2.关闭信号量

#include <semaphore.h>

sem_close(sem_t *sem);

参数 :信号量的地址

九.消息队列

1.创建消息队列

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

msgget(key_t key,int flag);

函数参数:1.key值
          2.访问权限

2.添加消息

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

msgsnd(int msqid,const void *msgp,size_t size,int flag);
函数参数:1.消息队列的ID 
         2.指向消息的指针
         3.发送消息的正文字节数
         4.  0:直到发送完成函数才返回 IPC_NOWAIT消息没有发送完成函数也会立即返回 

3.接受消息:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

msgrcv(int msgid,void * msgp,size_t size,long msgtype,int flag);
函数参数:1.消息队列的ID 
         2.接受消息的缓存区
         3.接受消息的字节数
         4. 0:要接收消息队列中的第一个消息
           大于0:接收消息队列中第一个类型为msgtyp的消息
         5.0:若无消息函数会一直阻塞
           IPC_NOWAIT:若没有消息,进程会立即返回
    
       

4.删除消息队列

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

msgctl(int msgqid,int cmd,struct msqid_ds *buf);

函数参数:1.消息队列的ID
         2.IPC_STAT: 读取消息队列的属性,并将其保存
           IPC_SET: 设置消息队列的属性
           IPC_RMID:从消息队列中删除消息队列
         3.消息队列缓存区

十.线程

1.创建线程

#include <pthread.h>

pthread_creat(pthread_t*thread,const pthread_attr_t *attr,void *(*routine)(void*),void*arg)

参数:1.创建的线程
      2.指定线程的属性,NULL表示缺省属性
      3.线程执行的函数
      4.传递给线程执行的函数的参数

2.线程的等待函数

#include <pthread.h>

prhread_join(pthread_t thread,void **value_ptr);

函数参数:1.要等待的指针

         2.指针指向线程返回的参数

3.将子线程设置成游离态

#include <pthread.h>

pthread_detach(pthread_t,thread);     

4.线程退出函数

#include <pthread.h>
 
 pthread_exit(void *value_ptr)

函数参数:线程退出时返回的值

11.同步

1.初始化:

#include <semaphore.h>

sem_init(sem_t*sem,int pshared,unsigned int int value)

函数参数:1.初始化的信号量
         2.信号量共享的范围  0线程间使用,非0:进程间的使用)
         3.信号量初值
         
        

2.操作

#include <semaphore.h>
sem_wait(sem_t*sem); p操作 信号量-1
sem_post(sem_t*sem); v操作 信号量+1  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值