网站开发培训程序员,多种不同产品的网站怎么做seo,写个网页多少钱,江苏住房与城乡建设厅网站1.引言 两个进程之间#xff0c;可以进行数据的直接传递吗#xff1f;不能#xff01;进程具有独立性
1.为什么#xff1f;#xff1f;
数据传输#xff1a;一个进程需要将它的数据发送给另一个进程资源共享#xff1a;多个进程之间共享同样的资源通知事件#xff1a…1.引言 两个进程之间可以进行数据的直接传递吗不能进程具有独立性
1.为什么
数据传输一个进程需要将它的数据发送给另一个进程资源共享多个进程之间共享同样的资源通知事件一个进程需要向另一个或一组进程发送消息通知它们发生了某种事件如进程终止时要通知父进程进程控制有些进程希望完全控制另一个进程的执行如调试进程此时控制进程希望能够拦截另一个进程的所有陷入和异常并能够及时知道它的状态改变 往往需要多个进程协同共同完成一些事情
2.是什么 一个进程把自己的数据能够交给另一个进程。
3.怎么办 a.一般规律 进程间通信的本质先让不同的进程看到同一份资源一般都是要由OS提供
交换数据的空间内存不能由通信双方任何一个提供 b.具体做法 OS提供的空间有不同的样式就决定了有不同的通信方式
管道匿名和命名基于文件的让不同进程看到同一份资源的通信方式叫做管道管道只能被设计成为单向通信共享内存消息队列信号量
2.管道 管道是一种半双工的通信方式数据只能单向流动而且只能在具有亲缘关系的进程间使用通常是一个父进程和它的子进程。管道的实质是一个内核缓冲区进程以先进先出FIFO的方式从缓冲区存取数据管道一端的进程顺序地将进程数据写入缓冲区另一端的进程则顺序地读取数据。 匿名管道可以只能进行具有血缘关系的进程进行进程间通信
代码测试如下
#include stdio.h
#include string.h
#include stdlib.h
#include unistd.h
#include sys/types.h
#include sys/wait.h
void writer(int wfd)
{const char* strhello father,I am child;char buffer[128];int cnt0;pid_t pidgetpid();while(1){snprintf(buffer,sizeof(buffer),message:%s,pid:%d,count:%d,str,pid,cnt);write(wfd,buffer,strlen(buffer));cnt;sleep(1);}
}
void reader(int rfd)
{char buffer[1024];while(1){ssize_t nread(rfd,buffer,sizeof(buffer)-1);(void)n;printf(father get a message %s,buffer);}
}
int main()
{int pipefd[2];int npipe(pipefd);if(n0) return 1;printf(pipefd[0]:%d,pipefd[1]:%d\n,pipefd[0],pipefd[1]);//3,4pid_t idfork();if(id0){//child:rclose(pipefd[0]);writer(pipefd[1]);exit(0);}//father:wclose(pipefd[1]);reader(pipefd[0]);wait(NULL);
}
a.4种情况 管道内部没有数据子进程不关闭自己的写端文件fd读端父就要阻塞等待直到pipe有数据管道内部被写满父进程读端不关闭自己的fd写端子写满之后就要阻塞等待对于写端而言不写了关闭了pipe读端会将pipe中的数据读完最后就会读到返回值为0表示读结束类似读到了文件的结尾读端不读关闭写端在写OS会直接终止写入的进程子进程通过信号13SIGPIPE 信号杀掉进程 b.5种特性 自带同步机制血缘关系进程进行通信常见于父子pipe是面向字节流的父子退出管道自动释放文件的生命周期是随进程的管道只能单向通信半双工的一种特殊情况