linux进程间通信课件.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

linux进程间通信;1、进程间通信概述;;;2、管道通信;2.1管道创建与关闭;注意:fd[0]用于读取管道,fd[1]用于写入管道。;#includeunistd.h

#includeerrno.h

#includestdio.h

#includestdlib.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);

返回值:返回调用状态。;#includestdio.h

#includeunistd.h

#includestdlib.h

#includefcntl.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参数有四种不同的情况:

您可能关注的文档

文档评论(0)

HappyDog + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档