文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>进程间通信(一)

进程间通信(一)

时间:2009-04-27  来源:hrdxwandg

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

#include<signal.h>
#include<stdio.h>
#include<unistd.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;k<4;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<unistd,h>
创建无名管道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);

说明:整理节选自胡明庆版《操作系统教程与试验》。

相关阅读 更多 +
排行榜 更多 +
小蚂蚁供应链

小蚂蚁供应链

购物比价 下载
家链医疗

家链医疗

健康医疗 下载
中国象棋对弈打谱

中国象棋对弈打谱

动作格斗 下载