首页 / LINUX / Linux系统编程@进程通信(一)
Linux系统编程@进程通信(一)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux系统编程@进程通信(一),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1868字,纯文字阅读大概需要3分钟。
内容图文
![Linux系统编程@进程通信(一)](/upload/InfoBanner/zyjiaocheng/1331/667d32f1180d4db48fcb3eb902fd45a4.jpg)
进程间通信概述
需要进程通信的原因:
数据传输
资源共享
通知事件
进程控制
Linux进程间通信(IPC)发展由来
Unix进程间通信
基于System V进程间通信(System V:UNIX系统的一个分支)
POSIX进程间通信(POSIX:可移植操作系统接口,为了提高UNIX环境下应用程序的可移植性。很多其他系统也支持POSIX标准(如:DEC OpenVMS和Windows)。)
现在Linux使用的进程间通信方式包括:
管道(pipe)、有名管道(FIFO)
信号(signal)
消息队列
共享内存
信号量
套接字(socket)
管道通讯
管道:单向的、先进先出的,把一个进程的输出和另一个进程的输入连接起来。一个进程(写进程)在管道尾部写入数据,另一个进程(读进程)从管道的头部读出数据。包括无名管道和有名管道,无名管道只用于父进程和子进程间的通信,有名管道可用于运行同一系统中的任意两个进程间的通信。
管道的创建
无名管道创建
int pipe(int filedis[2]);
int pipe_fd[2];
if(pipe(pipe_fd)<0) { printf("pipe create error\n"); return -1; }
当一个管道建立时,他会创建两个 文件描述符,filedis[0]用于读管道,filedis[1]用于写管道。
管道的关闭
int close(); //使用close分别关闭两个文件描述符
当管道的一端被关闭后,下面两条规则起作用
1.当读(read)一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束。
使用无名管道通信实例
通常,进程会先调用pipe,接着调用fork(这两步为了确保只生成一个管道,且子进程生成后能够继承文件描述符),从而创建从父进程到子进程的IPC管道。
![技术分享](/upload/getfiles/default/2022/11/14/20221114072931298.jpg)
![技术分享](/upload/getfiles/default/2022/11/14/20221114072931319.jpg)
1 #include <unistd.h> 2 #include <string.h> 3 #include <sys/types.h> 4 #include <errno.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 8int main() 9{ 10int pipe_fd[2]; 11 pid_t pid; 12char buf_r[100]; 13char* p_wbuf; 14int r_num; 1516 memset(buf_r,0,sizeof(buf_r)); 1718/*创建管道*/19if(pipe(pipe_fd)<0) 20 { 21 printf("pipe create error\n"); 22return -1; 23 } 2425/*创建子进程*/26if((pid=fork())==0) //子进程 27 { 28 printf("\n"); 29 close(pipe_fd[1]); //写关闭30 sleep(2); /*为什么要睡眠*/31if((r_num=read(pipe_fd[0],buf_r,100))>0) 32 { 33 printf( "%d numbers read from the pipe is %s\n",r_num,buf_r); 34 } 35 close(pipe_fd[0]); 36 exit(0); 37 } 38elseif(pid>0) //父进程39 { 40 close(pipe_fd[0]); //读关闭41if(write(pipe_fd[1],"Hello",5)!=-1) 42 printf("parent write1 Hello!\n"); 43if(write(pipe_fd[1]," Pipe",5)!=-1) 44 printf("parent write2 Pipe!\n"); 45 close(pipe_fd[1]); 46 sleep(3); 47 waitpid(pid,NULL,0); /*等待子进程结束*/48 exit(0); 49 } 50return0; 51 }
信号通讯
共享内存
消息队列
信号量
原文:http://www.cnblogs.com/kwseeker-bolgs/p/4379285.html
内容总结
以上是互联网集市为您收集整理的Linux系统编程@进程通信(一)全部内容,希望文章能够帮你解决Linux系统编程@进程通信(一)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。