免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1175 | 回复: 0
打印 上一主题 下一主题

进程间通信(一) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-27 18:25 |只看该作者 |倒序浏览
1.软中断通信
相关含义:
提供了一种简单的处理异步事件的方法。用户进程可以向自己发送信号以中断程序的执行,并自动转入指定的软中断处理函数中去执行用户自行安排的处理内容,处理完毕后再返回用户进程继续执行。此时进程处于运行状态。
实现方法:
进程在接收之前必须先使用signal()系统调用函数进行预置。系统预留给用户定义的信号一般只有SIGUSR1和SIGUSR2,但用户可对系统信号进行重新预置,使之运行用户定义的操作。同一个软中断信号可以通过多个signal()系统调用,分别与不同的处理函数进行关联,系统在响应该软中断信号时,执行的是当前预置的处理函数(最近预置的)。
#include
#include
软中断信号预置函数signal (sig , function)
发送软中断信号函数kill(pid , sig)
用此方法实现进程间同步
用exit()和wait()实现了父进程等子进程终止的同步。利用软中断通信可以实现子进程对父进程的等待。

#includesignal.h>
#includestdio.h>
#includeunistd.h>
int k1; //定义全局变量k1
void int_fun1(int sig) //定义软中断处理函数
{
    k1=0;
}
int main()
{
    int k,p1;
    while((p1=fork())==-1); //创建子进程
    if(p1>0) //父进程返回
    {
       for(k=1;k4;k++) //显示3行信息
       {
          printf(“How are you !\n”);
          sleep(1);
       }
       kill(p1,12); //发软中断信号给子进程
       wait(0); //等待子进程终止
       printf("OK!\n"); //输出结束信息
       exit(0);
   }
   else //子进程返回
   {
      signal(12,int_fun1); //预置软中断信号
      k1=1;
      /*循环显示并等待父进程发软中断信号*/
      while(k1==1)
      {
        printf(“I‘m child\n”);
        sleep(1);
      }
      printf(“Child exited!\n”);    //子进程结束信息
      exit(0);     //子进程终止
   }
}
2.管道通信
一种单向进程间通信机制。
无名管道
相关含义:
工作原理:管道中的数据格式是字符流,无名管道为创建管道的进程及其子孙提供传送消息的信道,逻辑上它是由操作系统在内存中创建的临时文件实现的,被看作是管道文件,物理上则由文件系统的高速缓冲区构成。
由于涉及到文件系统,无名管道文件描述符只能供创建管道的进程及其子孙进程共享使用,因为子进程能够继承父进程打开的所有文件,所以能够继承父进程所创建的无名管道文件。因此,进程间使用管道的通信方式仅限于同一家族的进程之间进行。
实现方法:
#include
创建无名管道pipe(int 管道名[2])---->例如:当定义了int pipe(int fp[2]); 则fp[1]用于写,fp[0]用于读。
写管道   write( 管道名[1], buf, size );
读管道   read( 管道名[0], buf, size );
管道为一临界资源,因此父子进程之间除了需要读写同步以外,在对管道进行读写操作时还需要互斥进入。
为了保证管道操作过程中不至于因为用户的疏忽而死锁,Linux采用以下措施来避免死锁:
⑴.当进程因读或写等待时,要检查管道的另一端是否已经关闭,如果发现对方已经关闭则直接返回,不再等待。
⑵.当进程关闭管道时,要检查管道的另一端是否正处于等待状态,如果是,则要先唤醒对方,然后再关闭管道。
如果进程需要实现互斥,因为管道是文件,可用下述对文件上锁和开锁的系统调用:
lockf(files,function,size)
参数说明:
files是需要加以封锁的文件描述符,此处可以是管道的读写端口;
function是功能选择:为1 表示上锁,为0表示开锁;
size表示锁定或开锁的字节数,其值为0则表示文件全部内容。

命名管道
相关含义:
可用于任何进程间的通信,进程通过类似于文件名但与管道相关的字符串来获取一个管道,由文件系统统一管理。一旦创建后可对它进行类似文件的操作。
实现方法:int mkfifo(const char * pathname,mode_t mode);
说明:整理节选自胡明庆版《操作系统教程与试验》。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94732/showart_1912263.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP