用word可以做网站吗,网络服务有哪些与影响,xxx美食网站建设规划书,wordpress百万数据库进程间通讯的目的
数据传输#xff1a;一个进程需要把它的数据发送给另一个数据资源共享#xff1a;多个进程需要共享同样的资源通知事件#xff1a;一个进程需要向另一个或者一组进程发送消息#xff0c;通知它发生了某种事件#xff08;如进程终止时要通知父进程#…进程间通讯的目的
数据传输一个进程需要把它的数据发送给另一个数据资源共享多个进程需要共享同样的资源通知事件一个进程需要向另一个或者一组进程发送消息通知它发生了某种事件如进程终止时要通知父进程进程控制有些进程希望控制另一个进程的执行此时控制进程希望可以拦截另一个进程所有陷入和异常并能及时知道它的状态改变
简而言之就是需要多个进程协同共同完成一些事情
进程通讯的方式
匿名管道命名管道System V IPC 消息队列共享内存信号量POSIX IPC 消息队列共享内存信号量互斥量条件变量读写锁
匿名管道 pipe函数创建一无名管道 参数fd文件描述符其中fd[0]表示读端fd[1]表示写端 返回值成功返回0失败返回返回错误代码 pipe创建的是内存级的文件匿名文件管道匿名管道只能进行血缘关系进程通讯。 #include stdio.h
#include unistd.h
#include stdlib.h
#include string.hint main()
{int fds[2];int n pipe(fds);char buffer[1024];if(n0)//返回值小于0创建失败{perror(pipe error!\n);exit(1);}//fork创建子进程可以继承父进程的PCBpid_t pid fork();if(pid0)//子进程{close(fds[1]);//关闭写端while(1){size_t size read(fds[0],buffer,sizeof(buffer)-1);if(size0){printf(子进程读取退出\n);exit(1);}buffer[size] 0;printf(子进程读取到%s,buffer);memset(buffer,0,sizeof(buffer));}}//父进程关闭读端close(fds[0]);while(fgets(buffer,sizeof(buffer),stdin)){size_t len strlen(buffer);if(len0){continue;}size_t size write(fds[1],buffer,len);if(size!len){perror(write error, exit!\n);exit(2);}else{printf(父进程写端写入%s,buffer);}memset(buffer,0,sizeof(buffer));}return 0;
}
匿名管道的4种情况
管道内部没有数据写端不关闭自己的写端文件符fd读端就要阻塞等待管道内部被写满读端不关闭自己的读端文件符fd写端就要阻塞等待对于写端而言关闭写端文件符wfd读端就会把pipe中数据读完最后就会读到返回值为0表示读结束类似读到了文件结尾对于读端而言关闭读端文件符rfd写端再写操作系统就会给写端进程发送信号SIGPIPE写端进程收到信号默认动作中止进程。(linux信号详解)
4个注意点
匿名管道只能用于父子进程通讯pipe是面向字节流的父子进程退出管道自动释放文件的生命周期是随进程的管道只能单向通讯
其实匿名管道在内核中是下面这样