数据传输:一个进程需求将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
同享数据:多个进程想要操作同享数据,一个进程对同享数据的修正,其他进程应该马上看到。
告诉事情:一个进程需求向另一个或一组进程发送音讯,告诉它(它们)发生了某种事情(如进程停止时要告诉父进程)。
资源同享:多个进程之间同享相同的资源。为了作到这一点,需求内核供给锁和同步机制。
进程操控:有些进程期望彻底操控另一个进程的履行(如Debug进程),此刻操控进程期望能够阻拦另一个进程的一切堕入和反常,并能够及时知道它的状况改动。
UNIX 进程间通讯(IPC)方法包含管道、FIFO、信号。
Linux 中运用较多的进程间通讯方法首要有以下几种。
(1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘联系进程间的通讯,有名管道,除具有管道所具有的功用外,它还答应无亲缘联系进程间的通讯。
(2)信号(Signal):信号是在软件层次上对中止机制的一种模仿,它是比较复杂的通讯方法,用于告诉承受进程有某事情发生,一个进程收到一个信号与处理器收到一个中止请求作用上能够说是相同的。
(3)音讯行列:音讯行列是音讯的链接表,包含Posix 音讯行列systemV 音讯行列。它克服了前两种通讯方法中信息量有限的缺陷,具有写权限的进程能够向音讯行列中依照必定的规矩增加新音讯;对音讯行列有读权限的进程则能够从音讯行列中读取音讯。
(4)同享内存:能够说这是最有用的进程间通讯方法。它使得多个进程能够拜访同一块内存空间,不同进程能够及时看到对方进程中对同享内存中数据的更新。这种通讯方法需求依托某种同步机制,如互斥锁和信号量等。
(5)信号量:首要作为进程间以及同一进程不同线程之间的同步手法。
(6)套接字(Socket):这是一种更为一般的进程间通讯机制,它可用于不同机器之间的进程间通讯,运用十分广泛。
[b]管道通讯[/b]
一般的Linux shell都答应重定向,而重定向运用的便是管道。例如:
ps | grep vsftpd
管道是单向的、先进先出的、无结构的、固定巨细的字节省,它把一个进程的规范输出和另一个进程的规范输入衔接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道供给了简略的流操控机制。进程企图读空管道时,在有数据写入管道前,进程将一向堵塞。相同,管道现已满时,进程再企图写管道,在其它进程从管道中移走数据之前,写进程将一向堵塞。
管道首要用于不同进程间通讯。
创立一个简略的管道,能够运用体系调用pipe( )。它承受一个参数,也便是一个包含两个整数的数组。假如体系调用成功,此数组将包含管道运用的两个文件描述符。创立一个管道之后,一般情况下进程将发生一个新的进程。
体系调用:pipe( );
原型:int pipe( int fd[2] );
回来值:假如体系调用成功,回来0。假如体系调用失利回来- 1:
errno = EMFILE (没有闲暇的文件描述符)
EMFILE (体系文件表已满)
EFAULT (fd数组无效)
留意:fd[0] 用于读取管道,fd[1] 用于写入管道。
#i nclude
#i nclude
#i nclude
#i nclude
int main()
{
int pipe_fd[2];
if(pipe(pipe_fd)0)
{
printf(pipe create error\n);
return -1;
}
else
printf(pipe create success\n);
close(pipe_fd[0]);
close(pipe_fd[1]);
}
管道首要用于不同进程间通讯。实际上,一般先创立一个管道,再经过fork函数创立一个子进程。
能够经过翻开两个管道来创立一个双向的管道。但需求在子进程中正确地设置文件描述符。
有必要在体系调用fork( )中调用pipe( ),不然子进程将不会承继文件描述符。
当运用半双工管道时,任何相关的进程都有必要同享一个相关的先人进程。由于管道存在于体系内核之中,所以任何不在创立管道的进程的先人进程之中的进程都将无法寻址它。而在命名管道中却不是这样。
与linux中文件操作有文件流的规范I/O相同,管道的操作也支撑根据文件流的形式。接口函数如下
库函数:popen();
原型: FILE *popen ( char *command, char *type);
回来值:假如成功,回来一个新的文件流。假如无法创立进程或许管道,回来NULL。
管道中数据流的方向是由第二个参数type操控的。此参数能够是r或许w,别离代表读或写。但不能一起为读和写。在Linux体系下,管道将会以参数type中榜首个字符代表的方法翻开。所以,假如你在参数type中写入rw,管道将会以读的方法翻开。
运用popen()创立的管道有必要运用pclose( )封闭。其实,popen/pclose和规范文件输入/输出流中的fopen() / fclose()十分相似。
库函数: pclose();
原型: int pclose( FILE *stream );
回来值: 回来体系调用wait4( )的状况。
假如stream无效,或许体系调用wait4( )失利,则回来 -1。
留意此库函数等候管道进程运转完毕,然后封闭文件流。
库函数pclose( )在运用popen( )创立的进程上履行wait4( )函数。当它回来时,它将损坏管道和文件体系。
#i nclude
#i nclude
#i nclude
#i nclude
#define BUFSIZE 1024
int main()
{
FILE *fp;
char *cmd = ps -ef;
char buf[BUFSIZE];
buf[BUFSIZE] = ‘\0’;
if((fp=popen(cmd,r))==NULL)
perror(popen);
while((fgets(buf,BUFSIZE,fp))!=NULL)
printf(%s,buf);