预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共53页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

linux进程间通信1、进程间通信概述2、管道通信2.1管道创建与关闭注意:fd[0]用于读取管道,fd[1]用于写入管道。#include<unistd.h> #include<errno.h> #include<stdio.h> #include<stdlib.h> intmain() { intpipe_fd[2]; if(pipe(pipe_fd)<0){ printf("pipecreateerror\n"); return-1; } else printf("pipecreatesuccess\n"); close(pipe_fd[0]); close(pipe_fd[1]); }2.2管道读写子进程写入和父进程读的命名管道:2.3管道读写注意事项2.4标准流管道使用popen()创建的管道必须使用pclose()关闭。其实,popen/pclose和标准文件输入/输出流中的fopen()/fclose()十分相似。 库函数:pclose(); 原型:intpclose(FILE*stream); 返回值:返回调用状态。#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<fcntl.h> #defineBUFSIZE1024 intmain() { FILE*fp; char*cmd="ps-ef"; charbuf[BUFSIZE]; buf[BUFSIZE]='\0'; if((fp=popen(cmd,"r"))==NULL) perror("popen"); while((fgets(buf,BUFSIZE,fp))!=NULL) printf("%s",buf); pclose(fp); exit(0); } 命名管道(FIFO)命名管道创建与操作当打开一个FIFO时,非阻塞标志(O_NONBLOCK)产生下列影响: (1)在一般情况中(没有说明O_NONBLOCK),只读打开要阻塞到某个其他进程为写打开此FIFO。类似,为写而打开一个FIFO要阻塞到某个其他进程为读而打开它。 (2)如果指定了O_NONBLOCK,则只读打开立即返回。但是,如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errno是ENXIO。 类似于管道,若写一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE。若某个FIFO的最后一个写进程关闭了该FIFO,则将为该FIFO的读进程产生一个文件结束标志。 信号通信Linux中的信号:下面是几个常见的信号。 SIGHUP:从终端上发出的挂起信号; SIGINT:来自键盘的中断信号(Ctrl-C); SIGQUIT:来自键盘的退出信号(Ctrl-\); SIGFPE:浮点异常信号(例如浮点运算溢出); SIGKILL:该信号结束接收信号的进程; SIGALRM:进程的定时器到期时,发送该信号; SIGTERM:中止信号;kill的默认发出信号; SIGCHLD:标识子进程停止或结束的信号; SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号 …………可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作。 (1)忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是未定义的。 (2)捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。如果捕捉到SIGCHLD信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的终止状态。 (3)执行系统默认动作。对大多数信号的系统默认动作是终止该进程。每一个信号都有一个缺省动作,它是当进程没有给这个信号指定处理程序时,内核对信号的处理。有5种缺省的动作: 异常终止(abort):在进程的当前目录下,把进程的地址空间内容、寄存器内容保存到一个叫做core的文件中,而后终止进程。 退出(exit):不产生core文件,直接终止进程。 忽略(ignore):忽略该信号。 停止(stop):挂起该进程。 继续(continue):如果进程被挂起,则恢复进程的运行。否则,忽略信号。3.2信号发送与捕捉kill的pid参数有四种不同的情况: pid>0将信号发送给进程ID为pid的进程。 pid==0将信号发送给其进程组ID等于发送进程的进程组ID,而且发送进程有许可