这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的。

实验题目:Linux环境下的进程间通信

实验目的:熟悉进程通信中信号概念及信号处理;掌握进程间的管道通信编程;了解进程间的内存共享编程。

实验内容:

一、信号

设计程序,满足如下要求:

1、编程程序:每隔1秒显示“running….”一次,显示8次后,程序结束。应用函数alarm,在程序开始运行5秒后发送信号SIGALRM,并实现:1)程序接收到SIGALRM信号就被终止;2)自定义信号处理函数,在程序接收到SIGALRM信号后,循环显示三次“handling SIGALRM”。

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<signal.h>
  4. #include<stdlib.h>
  5. int main()
  6. {
  7. alarm();
  8. int i;
  9. for(i=;i<=;i++)
  10. {
  11. printf("running…\n");
  12. sleep();
  13. }
  14. return ;
  15. }
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<signal.h>
  4. #include<stdlib.h>
  5. void fun()
  6. {
  7. int i=;
  8. for(i=;i<=;i++)
  9. {
  10. printf("handling SIGALRM \n");
  11. }
  12. }
  13. int main()
  14. {
  15. (void)signal(SIGALRM,fun);
  16. alarm();
  17. int i;
  18. for(i=;i<=;i++)
  19. {
  20. printf("running…\n");
  21. sleep();
  22. }
  23. return ;
  24. }

2、设计一个程序,要求用户进程创建一个子进程,子进程发送SIGSTOP将自身挂起,父进程向子进程发出SIGKILL信号,子进程收到此信号,结束子进程的运行。

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<stdlib.h>
  4. #include<signal.h>
  5. int main()
  6. {
  7. pid_t pid;
  8. pid=fork();
  9. int ret;
  10. if(pid <)
  11. {
  12. printf("Error Exit!\n");
  13. exit();
  14. }
  15. else if(pid==)
  16. {
  17. raise(SIGSTOP);
  18. exit();
  19. }
  20. else
  21. {
  22. printf("子进程的进程号是:%d\n",pid);
  23. if(waitpid(pid,NULL,WNOHANG)==)
  24. {
  25. if(ret=kill(pid,SIGKILL)==)
  26. {
  27. ptintf("fun kill's return is %d,pid is%d\n",ret,pid);
  28. }
  29. }
  30. }
  31. return ;
  32. }

3、设计一个程序,要求程序运行后进入无限循环,要求主程序运行时,即使用户按下中断键(Ctrl+Z和Ctrl+\),也不能影响正在运行的程序,即让信号处于阻塞状态,当主体程序运行完毕后才进入自定义信号处理函数,当用户再次按下中断键(Ctrl+Z和Ctrl+\)后,结束程序运行。

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<signal.h>
  4. #include<sys/types.h>
  5. #include<stdlib.h>
  6. void fun_z()
  7. {
  8. printf("you press Ctrl+z\n");
  9. printf("Ctrl + z is useable now!\n");
  10. signal(SIGTSTP,SIG_DFL);
  11.  
  12. }
  13. void fun_d()
  14. {
  15. printf("you press 'Ctrl+\' \n");
  16. printf("Ctrl + d is useable now!\n");
  17. signal(SIGQUIT,SIG_DFL);
  18.  
  19. }
  20. int main()
  21. {
  22. int i;
  23. sigset_t set,pendset;
  24. struct sigaction action;
  25. signal(SIGTSTP,fun_z);
  26. signal(SIGQUIT,fun_d);
  27. if(sigemptyset(&set)<)
  28. perror("init sign error!");
  29. if(sigaddset(&set,SIGTSTP)<)
  30. perror("add ctrl+z error!\n");
  31. if(sigaddset(&set,SIGQUIT)<)
  32. perror("ass 'ctrl+\' error!\n");
  33. while()
  34. {
  35. printf("Ctrl +z and 'Ctrl +\' is zuse!\n");
  36. sleep();
  37. }
  38.  
  39. return ;
  40. }

二、管道

1、设计一个程序,要求创建一个管道,复制进程,父进程往管道中写入字符串“how are you!”,子进程从管道中读取并输入字符串“how are you!”。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<sys/types.h>
  4. #include<sys/wait.h>
  5. #include<unistd.h>
  6. #include<string.h>
  7. int main()
  8. {
  9. pid_t result;
  10. int n;
  11. int pipe_fd[];
  12. char buf1[],buf2[];
  13. memset(buf1,,sizeof(buf1));
  14. if(pipe(pipe_fd)<)
  15. {
  16. printf("error!\n");
  17. return -;
  18. }
  19. result=fork();
  20. if(result<)
  21. {
  22. printf("error!\n");
  23. exit();
  24. }
  25. else if(result==)
  26. {
  27. close(pipe_fd[]);
  28. if((n =read(pipe_fd[],buf1,))>)
  29. {
  30. printf("child read %d char,char is %s\n",n,buf1);
  31. close(pipe_fd[]);
  32. exit();
  33. }
  34. }
  35. else
  36. {
  37. close(pipe_fd[]);
  38. printf("please input pipe word \n");
  39. fgets(buf2,sizeof(buf2),stdin);
  40. if(write(pipe_fd[],buf2,strlen(buf2))!=-)
  41. printf("parent write to child is: %s\n",buf2);
  42. close(pipe_fd[]);
  43. waitpid(result,NULL,);
  44. exit();
  45. }
  46.  
  47. return ;
  48. }

2、设计一个程序,要求用popen创建管道,实现“rpm -qa | grep nfs”的功能。

3、设计一个程序,要求创建一个管道PIPE,复制进程,父进程运行命令“ls –l”,把运行结果写入管道,子进程从管道中读取“ls -l”的结果,把读出的作为输入接着运行“grep .c”。

三、共享内存

1、设计一个程序,要求创建进程,父子进程通过匿名映射实现共享内存

 

【Linux程序设计】之进程间的通信的更多相关文章

  1. Linux c 管道文件-进程间的通信 mkfifo、pipe

    管道文件: 1.       创建管道mkfifo(命名管道) #include<sys/stat.h> int mkfifo( const  char  *pathname, mode_ ...

  2. Linux进程间的通信

    一.管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: A. 管道是半双工的,数据只能向一个方向流动: B. 需要双工通信时,需要建立起两个管道: C. 只能用于父子进程或者兄弟 ...

  3. c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...

  4. PHP与Linux进程间的通信

    进程间通信预计是公司考察应届毕业生的必考点(嵌入式行业).当然非常多公司考的是算法. 不查阅资料,我脑子里能想到的 [1] 管道, (有名.无名) [2] 父子进程 [3] System V (消息队 ...

  5. c 进程间的通信

    在上篇讲解了如何创建和调用进程 c 进程和系统调用 这篇文章就专门讲讲进程通信的问题 先来看一段下边的代码,这段代码的作用是根据关键字调用一个Python程序来检索RSS源,然后打开那个URL #in ...

  6. Linux 线程与进程,以及通信

    http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...

  7. Nginx学习——Nginx进程间的通信

    nginx进程间的通信 进程间消息传递 共享内存 共享内存还是Linux下提供的最主要的进程间通信方式,它通过mmap和shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者 ...

  8. swoole进程间如何通信

    Swoole进程间通信的方式 管道pipe 管道用于进程之间的数据交互,Linux系统本身提供了pipe函数用于创建一个半双工通信管道.半双工的通信方式中数据只能单向流动(一端只读一端只写),只能在具 ...

  9. Android进程间的通信之AIDL

    Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作.实现这些操作之一是通过Android接口定义语言(AIDL ...

  10. Android进程间的通信之Messenger

    Android进程间的通信方式可以通过以下两种方式完成: Android接口定义语言(AIDL) 使用Messenger绑定服务 本文我们将学习使用Messenger绑定服务的方式进行进程间的通信. ...

随机推荐

  1. hdu 1541 Stars

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 思路:要求求出不同等级的星星的个数,开始怎么也想不到用树状数组,看完某些大神的博客之后才用树状数 ...

  2. JavaScript基础——处理字符串

    String对象是迄今为止在JavaScript中最常用的对象.在你定义一个字符串数据类型的变量的任何时候,JavaScript就自定为你创建一个String对象.例如: var myStr = &q ...

  3. Lattice 的 DDR IP核使用调试笔记之DDR 的 仿真

    —— 远航路上ing 整理于 博客园.转载请标明出处. 在上节建立完工程之后,要想明确DDR IP的使用细节,最好是做仿真.然后参考仿真来控制IP 核. 仿真的建立: 1.在IP核内的以下路径找到以下 ...

  4. Android -- java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

    使用Bundle 的getParcelableArray 出现了以下错误: Class not found when unmarshallingjava.lang.ClassNotFoundExcep ...

  5. 《CLR via C#》读书笔记(6)类型和成员基础

    6.1 类型的各种成员 在一个类型中,可以定义0个或者多个以下种类的成员: 常量 常量是在编译时设置其值并且永远不能更改其值的字段.使用常量可以为特殊值提供有意义的名称以代替数字文本,以使代码变得更容 ...

  6. Qt Designer怎样加入资源文件

    Qt Designer中如果在设计UI界面的时候要加入一些图素,图标等资源的时候是不能直接添加进去的,需要在Qt开发目录下编写QRC文件 qrc文件格式如下: <RCC> <qres ...

  7. postgresql设置默认的search_path

    -- Use this to show the current search_path -- Should return: "$user",public SHOW search_p ...

  8. bootstrap表单带验证

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  9. hdu 1404 找sg ***

    HDU 1404  Digital Deletions 一串由0~9组成的数字,可以进行两个操作:1.把其中一个数变为比它小的数:2.把其中一个数字0及其右边的所以数字删除. 两人轮流进行操作,最后把 ...

  10. [Tools] maven-eclipse安装及配置

    [背景] 买了个surface,带到公司当做开发机器来用,各种环境都需要重新安装,写个笔记记录下maven安装步骤,虽然很简单,但是我这脑子,容易忘记,写下来以备用 [开工] 安装Maven 访问 M ...