【Linux程序设计】之进程间的通信

时间:2022-09-11 14:05:49

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

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

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

实验内容:

一、信号

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

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

 #include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
int main()
{
alarm();
int i;
for(i=;i<=;i++)
{
printf("running…\n");
sleep();
}
return ;
}
 #include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
void fun()
{
int i=;
for(i=;i<=;i++)
{
printf("handling SIGALRM \n");
}
}
int main()
{
(void)signal(SIGALRM,fun);
alarm();
int i;
for(i=;i<=;i++)
{
printf("running…\n");
sleep();
}
return ;
}

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

 #include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
int main()
{
pid_t pid;
pid=fork();
int ret;
if(pid <)
{
printf("Error Exit!\n");
exit();
}
else if(pid==)
{
raise(SIGSTOP);
exit();
}
else
{
printf("子进程的进程号是:%d\n",pid);
if(waitpid(pid,NULL,WNOHANG)==)
{
if(ret=kill(pid,SIGKILL)==)
{
ptintf("fun kill's return is %d,pid is%d\n",ret,pid);
}
}
}
return ;
}

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

 #include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<stdlib.h>
void fun_z()
{
printf("you press Ctrl+z\n");
printf("Ctrl + z is useable now!\n");
signal(SIGTSTP,SIG_DFL); }
void fun_d()
{
printf("you press 'Ctrl+\' \n");
printf("Ctrl + d is useable now!\n");
signal(SIGQUIT,SIG_DFL); }
int main()
{
int i;
sigset_t set,pendset;
struct sigaction action;
signal(SIGTSTP,fun_z);
signal(SIGQUIT,fun_d);
if(sigemptyset(&set)<)
perror("init sign error!");
if(sigaddset(&set,SIGTSTP)<)
perror("add ctrl+z error!\n");
if(sigaddset(&set,SIGQUIT)<)
perror("ass 'ctrl+\' error!\n");
while()
{
printf("Ctrl +z and 'Ctrl +\' is zuse!\n");
sleep();
} return ;
}

二、管道

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

 #include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<string.h>
int main()
{
pid_t result;
int n;
int pipe_fd[];
char buf1[],buf2[];
memset(buf1,,sizeof(buf1));
if(pipe(pipe_fd)<)
{
printf("error!\n");
return -;
}
result=fork();
if(result<)
{
printf("error!\n");
exit();
}
else if(result==)
{
close(pipe_fd[]);
if((n =read(pipe_fd[],buf1,))>)
{
printf("child read %d char,char is %s\n",n,buf1);
close(pipe_fd[]);
exit();
}
}
else
{
close(pipe_fd[]);
printf("please input pipe word \n");
fgets(buf2,sizeof(buf2),stdin);
if(write(pipe_fd[],buf2,strlen(buf2))!=-)
printf("parent write to child is: %s\n",buf2);
close(pipe_fd[]);
waitpid(result,NULL,);
exit();
} return ;
}

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&plus;&plus; 网络编程(三) LINUX&sol;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. webpack入门教程之Hello webpack&lpar;一&rpar;

    webpack入门教程系列为官网Tutorials的个人译文,旨在给予想要学习webpack的小伙伴一个另外的途径.如有不当之处,请大家指出. 看完入门教程系列后,你将会学习到如下内容: 1.如何安装 ...

  2. Thinkphp中controller控制器根据curl函数请求数据

    public function member(){ $url="http://aitequn.tjnit.com/UserAction_findAllUser"; $ch =cur ...

  3. 学习 ---- JavaScript 高级设计程序 第三章(数据类型)

                                    3.4 数据类型 基本数据类型:Undefined.Null.Boolean.Number.String 复杂数据类型:Object 3 ...

  4. linux命令-ssh &lbrace;远程登录&rcub;

    一 命令解释 命令: ssh ssh [-l login_name] [-p port] [user@]hostname

  5. &lbrack;xsd学习&rsqb;xsd介绍

    一直以来项目中对xml格式的判断使用的都是dtd格式,直到最近才发现,不知何时都已经转为xsd来进行判断和校验,于是今天专门找资料看下,不得不说,对于这类资料的入门,w3cschool真是个不错的资料 ...

  6. vim总结

    1.vim基础用法 注:该思维导图来自笔者<Linux就该这么学>读书笔记. 移动光标: 命令 描述 k 向上移动光标(移动一行) j 向下移动光标(移动一行) h 向左移动光标(移动一个 ...

  7. JavaEE基础(二十四)&sol;多线程

    1.多线程(多线程的引入) 1.什么是线程 线程是程序执行的一条路径, 一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率, 可以同时完成多项工作 2.多线程的应用场景 红蜘蛛同时共享屏幕给 ...

  8. python引入导入自定义模块和外部文件

    参考:http://blog.csdn.net/devil_2009/article/details/15816237 项目中想使用以前的代码,或者什么样的需求致使你需要导入外部的包 如果是web 下 ...

  9. Mac/ios 模拟器 测试模拟慢网速

    原文:http://www.heyuan110.com/2015/06/16/Mac%E6%B5%8B%E8%AF%95%E6%A8%A1%E6%8B%9F%E6%85%A2%E7%BD%91%E9% ...

  10. Linux-问题集锦&lpar;1&rpar;

    一. 某用户只读特定文件夹 只读目录 :  /home/www/yqz/logs 1.  创建用户        useradd ReadOnly        passwd ReadOnly 2. ...