实验进程与线程——Linux进程与线程通讯

实验 进程与线程——Linux 进程与线程通讯 实验目的 实验内容 实验准备 实验设计 参考代码 实验结果 思考题 实验目的 深刻理解线程和进程的概念,掌握线程与进程在组成成分上的差别,以及与其相适应的通讯方式和应用目标。 实验内容 以Linux系统进程和线程机制为背景,掌握fork()和clone()系统调用的形式和功能,以及与其相适应的高级通讯方式。由fork派生的子进程之间通过pipe通讯,由clone创建的线程之间通过共享内存通讯,对于后者需要考虑互斥问题。 以生产者/消费者问题为例,通过实验理解fork()和clone()两个系统调用的区别。程序要求能够创建4个进程或线程,其中包括两个生产者和两个消费者,生产者和消费者之间能够传递数据。 实验准备 fork系统调用 clone系统调用 pipe系统调用 sem_wait(&s)和sem_post(&s) pthread_mutex_lock(&mutex)和pthread_mutex_unlock(&mutex) fork系统调用 pid=fork() 创建一个子进程,子进程是父进程的完整复制,正常返回值为非负整数,对于父进程来说该数大于0,是子进程的编号(pid);对于子进程来说该数为0。正是利用反回值的差别可以决定二者不同的后继动作。 clone系统调用 int clone (int ( *fn ) (void *arg) , void *stack , int flag , void *arg) ; 其中,fn是轻进程所执行的函数;stack是轻进程所使用的栈;flag是CLONE_VM, CLONE_FS, CLONE_FILES, CLONE_SIGHAND, CLONE_PID的组合;arg是调用过程的对应参数。Clone()的关键是flag的设定,CLONE_VM表示子进程共享父进程内存,CLONE_FS表示子进程共享父进程的文件系统,CLONE_SIGHAND表示子进程共享父进程的消息处理机制,CLONE_PID是指子进程继承父进程的id号。 pipe系统调用 ret_val=pipe(fd); 参数定义为int fd[2]。创建一个管道文件,返回两个文件描述符fd[0]和fd[1]分别用于管道文件的读和写操作。管道文件创建后,可以被fork创建的子进程共享。 sem_wait(&s)和sem_post(&s) sem_wait(&s)和sem_post(&s)分别相当于信号灯的P操作和V操作。其中s是说明为sem_t类型的信号灯。初始化函数sem_init(s,0,8)。 pthread_mutex_lock(&mutex)和pthread_mutex_unlock(&mutex) pthread_mutex_lock(&mutex)和pthread_mutex_unlock(&mutex)分别用于加锁和解锁。参数为pthread_mutex_t mutex定义的互斥锁。初始化tthread_mutex_init(&mutex,NULL)。 实验设计 用pipe()创建一个管道文件,然后用fork()创建两个生产进程和两个消费进程,它们之间通过pipe()传递信息。 用clone()创建四个轻进程(线程),用参数指明共享内存等资源,通过共享内存模拟生产消费问题,利用pthread_mutex_lock(), pthread_mutex_unlock()等函数实现对共享存储区访问的互斥。 参考代码 基于fork()系统调用 基于clone()系统调用 基于fork()系统调用 #include "sys/types.h" #include "sys/file.h" #include "unistd.h" char r_buf[4]; //读缓冲 char w_buf[4]; //写缓冲 int pipe_fd[2]; pid_t pid1, pid2, pid3, pid4; int producer(int id); int consumer(int id); int main(int argc,char **argv) { if(pipe(pipe_fd)<0) { printf("pipe create error \n"); exit(-1); } else { printf("pipe is created successfully!\n"); if((pid1=fork())==0)

linux进程与线程的通讯,实验进程与线程——Linux进程与线程通讯.ppt相关推荐

  1. 实验六:分析Linux内核创建一个新进程的过程

    20135108 李泽源 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h ...

  2. Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...

  3. linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep

    linux的进程/线程/协程系列3:查看linux内核源码--vim+ctags/find+grep 前言 摘要: 1. 下载linux内核源码 2. 打标签方法:vim+ctags 2.1 安装vi ...

  4. 操作系统实验报告——实验一:熟悉Linux命令及进程管理

    实验目的 熟悉Linux系统,掌握Linux系统的登入.退出等操作: 熟悉Linux命令及进程管理.作业控制: 学会使用Linux下C语言编程的基本知识: 掌握Linux中vi的基本操作: 掌握Lin ...

  5. 【Linux进程、线程、任务调度】三 CPU/IO消耗型进程 吞吐率/响应 SCHED_FIFO算法与SCHED_RR算法 SCHED_NORMAL算法和CFS算法 nice与renic chrt

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

  6. linux指定cpu运行程序,进程/线程绑定到特定CPU核的linux实现(有代码有实例)

    前言 现在计算机上的CPU大多都是多核的,有4核甚至是8核的.但是一个计算机启动之后其进程数是远远多于CPU核数的,因为操作系统会给自动调度这些进程在CPU核上轮流运行.但是对于应用程序或者进程,其性 ...

  7. linux进程池动态维护,可直接商用的跨平台c,c++动态线程池,任务池stpool库

    stpool是一个轻便高效的动态跨平台的线程池/任务池库. 常规线程池的缺点: 1. 总是启动时候就开启固定数目的线程,而不管系统的繁忙状态 (这是很浪费系统资源的). 2. 当任务繁重的时候,即使线 ...

  8. 利用who,w,ps和top等指令查看linux下的进程执行情况.,UNIXLINUX操作系统实验指导书...

    STAT 该进程的状态.其中S代表休眠状态:D代表不可中断的休眠状态:R代表运行状态:Z代表僵死状态:T代表停止或跟踪状态. TIME 该进程自启动以来所占用的总CPU时间.如果进入的是累计模式,那么 ...

  9. 【正点原子Linux连载】第九章 进程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  10. Linux下gdb attach的使用(调试已在运行的进程)

    在Linux上,执行有多线程的程序时,当程序执行退出操作时有时会遇到卡死现象,如果程序模块多,代码量大,很难快速定位,此时可试试gdb attach方法. 测试代码main.cpp如下,这里为了使程序 ...

最新文章

  1. Linux下的内存对齐函数
  2. C++ std::condition_variable wait() wait_for() 区别
  3. android五子棋设计模板,基于android的五子棋游戏设计
  4. MyEclipse-6.5注冊码生成器源代码
  5. 【Flink】Flink开发中遇到的问题及解法
  6. vue2.0项目部署到服务器_阿里云服务器搭建及项目部署过程---小白篇
  7. 2022爱分析· 地产科技厂商全景报告
  8. phpstudy打开浏览php页面发现显示源码解决方法
  9. [GIS热点] 网络篇-WebGIS、物联网、网格GIS、雾GIS、云计算
  10. RFC 文档中文目录
  11. 从Ajax聊一聊Jsonp hijacking
  12. mac mysql 移动硬盘_Mac下无法推出硬盘
  13. 如何将WORD中的公式转为图片
  14. DDR扫盲——DDR与DDR2、DDR3的区别
  15. 计算机网络:ALOHA协议
  16. 轮廓线扫描算法:Theo Pavlidis' Algorithm
  17. 【服务器开发必备知识总结】:BMC开发、raid卡、HBA卡、HDD硬盘、SSD硬盘、ME、cpld、服务器路数、U数介绍、intel cpu 平台架构介绍
  18. 有哪些原创的微信公众号推荐?(it技术编程类)
  19. LeetCode 1374.生成每种字符都是奇数个的字符串
  20. PHP基础测试题(一)

热门文章

  1. SLAM学习笔记-------------(四)李群与李代数
  2. 51nod1242--斐波那契第n项--矩阵快速幂
  3. bs和php,BSPHP - WEB源码|源代码 - 源码中国
  4. vba ado返回集合_带你进入VBA中Address地址世界
  5. 顺序队列为空的条件_C语言实现顺序队列
  6. php安装扩展的几种方法
  7. 树莓派计算机视觉环境搭建
  8. homebrew osx下面最优秀的包管理工具
  9. Linux系统裁减之,制作一个极度精简的Linux-5-重新编译login去除对pam模块的依赖...
  10. 基于PhalApi的Redis拓展