首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux:进程间通信(一.初识进程间通信、匿名管道命名管道、共享内存)

当读端管道读取数据时,这些数据会被内核的缓冲区移除(或称为消费),从而为写端提供了更多的空间来写入新的数据 C语言中,可以使用pipe()函数来创建一个匿名管道。...在打开命名管道时,进程需要指定相应的读写权限。 读写数据: 进程可以通过打开的文件描述符对命名管道进行读写操作。一个进程往管道写入数据,另一个进程管道读取数据。...命名管道阻塞的,如果写入进程写入数据时,没有进程读取数据,写入进程会被阻塞直到有进程读取数据。 进程间通信: 命名管道通常用于实现进程间通信,特别是父子进程或者**不相关进程之间**。...但为什么这里是接着阻塞呢? 阻塞模式下,如果读取到文件末尾(没有更多的数据可读取),read 函数会立即返回 0。...例如,阻塞模式下,如果调用read函数读取一个文件描述符,但是文件没有数据可读,read函数将立即返回一个错误码,而不会等待数据到达。

26620

socketpair函数用法

Unix套接字好像是套接字和管道的混合,socketpair()可以创建一对无命名的、相互连接的Unix域套接字。 管道历史上,它们是半双工的(数据只能在一个方向上流动),但是现在也有全双工管道。...管道只能在具有共同祖先的两个进程之间使用,通常一个管道由一个进程创建,进程调用fork之后,这个管道就你能在父进程和子进程之间使用了。...例如,可以往sockfd[0]写,sockfd[1]读;或者sockfd[1]写,sockfd[0]读; 2....如果往一个套接字(如sockfd[0])写入后,再从该套接字读时会阻塞,只能在另一个套接字(sockfd[1])上读成功; 3....socket 处理代码. 2、EFAULT 参数中有一指针指向无法存取的内存空间 3、ENOTSOCK 参数s 为一文件描述词, socket. 4、EINTR 被信号所中断. 5、EAGAIN

2K30
您找到你想要的搜索结果了吗?
是的
没有找到

Linux进程通信

(1) 管道的大小 管道的大小是PIPE_BUF(ubuntu操作系统为65536) 管道读取数据 写端存在时,当管道无数据时,读操作就会阻塞。...写端存在时,当读端请求读取的数据大于管道的数据时,此时读取管道实际的数据。当读端请求读取的数据小于管道的数据时,此时返回请求读取的数据。...当读一个写端已经被关闭的管道时,在所有数据都被读取后,read返回0,以指示达到了文件结束处。 向管道写数据 读端存在时,向管道写入数据时,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。...1.2 命名管道 1.2.1 概念及相关知识 命名管道可以使用在两个互不相干的进程间通信,有名管道可以通过路径名指出,并在文件系统显示出来。...用open函数打开命名管道时要注意亮点: 不能以O_RDWR模式打开命名管道FIFO文件,否则其行为是未定义的管道是单向的,不能同时读写; 传递给open调用的是FIFO的路径名,而不是正常的文件 打开

1.9K20

Linux命令mkfifo深度解析

与普通文件不同,命名管道不提供数据的持久存储,而是作为一个通道,实现进程间的数据传递。当一个进程向命名管道写入数据时,另一个进程可以管道读取数据,从而实现进程间的通信。...阻塞/阻塞模式:当使用open()函数打开命名管道时,可以设置阻塞阻塞模式。阻塞模式下,如果管道没有数据可读或没有进程写入数据,则读取或写入操作会被阻塞,直到条件满足。...而在阻塞模式下,如果管道没有数据可读或没有进程写入数据,则读取或写入操作会立即返回错误。权限控制:与普通文件一样,命名管道也具有访问权限。通过mkfifo命令的-m参数,可以指定命名管道的权限。...A,使用cat命令打开命名管道进行读取(注意此时会阻塞,等待数据写入):cat mypipe终端B,向命名管道写入数据:echo "Hello, mkfifo!"...> mypipe此时,终端A可以看到输出的数据:“Hello, mkfifo!”。四、注意事项和最佳实践阻塞/阻塞模式的选择:根据实际需求选择合适的阻塞/阻塞模式。

14410

linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF

return 0; } 程序中将写端文件状态标志设置为阻塞,当管道被写满时不会等待其他进程读取数据,而是直接返回-1并置errno,输出如下: simba@ubuntu:~/Documents...也有提到2.6.11内核以前是4096,现在是65536。...68k,即每个子进程完全写入68k才返回,而父进程对管道进行阻塞读取,每次读取4k,打印每4k的最后一个字符,如果没有数据到达就阻塞等待,如果管道剩余数据不足4k,read 很可能返回 < 4k,但因为我们写入...需要注意的是是边写边读,因为前面说过管道的容量只有64k,当管道被写满时子进程就阻塞等待父进程读取后再写入。...读端也不能设置为阻塞,如果此时尚未有数据写入(管道为空)则返回-1并置错误码为EAGAIN,如果有部分数据已经写入,则读取的数据字节数也是不确定的,需要检查read的返回值。

3.1K90

Linux进程通信之管道解析

所谓的管道,也就是内核里面的一串缓存,管道的一段写入的数据,实际上是缓存在内核的,令一端读取,也就是内核读取这段数据。对于管道传输的数据是无格式的流且大小受限。...如果试图向已经填满的管道写入,系统会自动阻塞。一个管道不能同时被两个进程打开。...extern ssize_ t write(int __fd, __const void *__buf, size_t __n); buf指向的缓冲区管道写入nbytes字节,且每次写入的内容都附件管道的末端...write程序的时候,没有进程打开读端,也就阻塞了 open函数的运行,只有运行read操作,以读的方式读取管道的数据,这样才能使得write的open函数继续执行。...综上,也就是命名管道进程通信的一个例子。 小结 上述就是本次进程通信中关于管道的相关内容,其中就包括匿名管道以及命名管道,他们之间存在着差别吗,也各有各的应用,本次的分享就到这里啦~ ?

1.4K10

由一道面试题来了解进程间的通信

写进程管道的尾端写入数据,读进程管道的道端读出数据。数据读出后将从管道移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。...同样,管道已经满时,进程再试图写管道,在其它进程管道移走数据之前,写进程将一直阻塞管道主要用于不同进程间通信。 管道创建与关闭 创建一个简单的管道,可以使用系统调用pipe()。...如果系统调用失败返回-1: errno=EMFILE(没有空亲的文件描述符)       EMFILE(系统文件表已满)       EFAULT(fd数组无效) 注意:fd[0]用于读取管道,fd[1...=NULL)  printf("%s",buf); pclose(fp); exit(0); } 命名管道(FIFO) 基本概念 命名管道和一般的管道基本相同,但也有一些显著的不同: A、命名管道文件系统作为一个特殊的设备文件而存在的...当打开一个FIFO时,阻塞标(O_NONBLOCK)产生下列影响: (1)一般情况(没有说明O_NONBLOCK),只读打开要阻塞到某个其他进程为写打开此FIFO。

2.2K70

Linux进程间通信(上)之管道、消息队列实践

(1)打开一个文件,管道的写入端向文件写入数据;管道读取文件读取出数据。...//第一个参数为有名管道文件路径 //第二个参数表明是以读取方式并以阻塞方式打开有名管道 //O_RDONLY读取模式 //O_NONBLOCK阻塞方式 fd...下面打开另外一个终端运行fifo_read 切换到另外一个终端,终端输入ls –l可以看到由于fifo_write创建了管道文件txt,从前面的字串prwxr-xr-x的p可以知道,这是一个管道文件...运行fifo_read,这时候,可以看到管道获取的字符串hello write_fifo,如下图所示: ? 管道读取结束后,fifo_write这个程序也就不会在阻塞在终端了,如下图所示: ?...我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。

2.3K10

Linux 的进程间通信:管道

PIPE 我们可以把匿名管道命名管道分别叫做PIPE和FIFO。这主要因为系统编程,创建匿名管道的系统调用是pipe(),而创建命名管道的函数是mkfifo()。...pipefd[0]是读方式打开,作为管道的读描述符。pipefd[1]是写方式打开,作为管道的写描述符。管道写端写入的数据会被内核缓存直到有人另一端读取为止。...,并且对管道写了一个字符串之后管道读取,并打印标准输出上。...而PIPESIZE的影响是,大于其长度的写操作会被阻塞,直到当前管道的数据被读取为止。 Linux 2.6.11之前,PIPESIZE和PIPEBUF实际上是一样的。...FIFO 命名管道底层的实现跟匿名管道完全一致,区别只是命名管道会有一个全局可见的文件名以供别人open打开使用。再程序创建一个命名管道文件的方法有两种,一种是使用mkfifo函数。

8.3K21

CSAPP 网络编程 笔记

可通过 sockatmark 读取带外标识位置。 阻塞阻塞 为什么会阻塞? 两个缓冲区:内核缓冲区、进程缓冲区,当内核缓冲区未满足时,该进程将被投入休眠。 什么是非阻塞?...此期间可以将三次握手迭合在其他处理上 利用阻塞 connect 技术同时建立多个连接 利用 select 指定时间限制,缩短connect的超时(很多实现connect超时为75秒到数分钟) 1.设置套接口为阻塞...FIFO 管道可用于具有亲缘关系进程间的通信 命令管道克服了管道没有名字的限制,命名管道允许无亲缘关系进程间的通信 UNIX 域协议 IPC 消息通信 消息通信通过消息队列实现进程通信 消息队列是消息的链接表...有足够的权限的进程可以向队列添加消息,被赋予读权限的进程可以读取队列的消息 消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等特点 消息队列不需要进程间具有亲缘关系 信号与信号量...、管道的区别 命名管道以 FIFO 的形式存在于文件系统,与 FIFO 创建进程无亲缘关系的进程只要能访问该路径,就能彼此通信 管道最后一个关闭后自动消失,而 FIFO 需要通过 unlink 删除

54630

linux系统编程之管道(三):命名管道FIFO和mkfifo函数

文件类型s表示socket,这些文件磁盘上也没有数据块。 一、命名管道(FIFO) 匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。...命名管道可以从命令行上创建,命令行方法是使用下面这个命令: $ mkfifo filename 命名管道也可以程序里创建,相关函数有: int mkfifo(const char *filename...RD程序,此时会阻塞,再在另一个窗口运行WR程序,此时两个程序都会open返回成功。...阻塞时也不难测试,open时增加标志位就可以了。 需要注意的是 命令管道与匿名管道的读写规则是一样的,参见这里。...tp,将Makefile 的文件都读取到tp文件

3.5K60

进程间通讯(五).message queue(1)

,由消息队列标识符标识 一个消息可以看成一个记录,具有特定的格式以及特定的类别 对消息队列有写权限的进程可以向消息队列按照一定的规则添加新消息;对消息队列有读权限的进程则可以消息队列读走消息。...我们可以通过发送消息 来避免命名管道的同步和阻塞问题。消息队列与管道不同的是,消息队列是基于消息的, 而管道是基于字节流的,且消息队列的读取不一定是先入先出。...消息队列与命名管道有一 样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI) 某个进程往一个队列写入消息之前...,并不需要另外某个进程该队列上等待消息的到达 pipe 和 FIFO 最后一次关闭发生时,仍在该管道或FIFO上的数据将被丢弃,消息队列,除非内核自举或显式删除,否则其一直存在 管道和FIFO都是随进程持续的...用户可以通过 Msgctl()系统调用来增加现有消息队列的容量 Tip: /etc/sysctl.conf 可以进行内核配置 ---- 代码示例 要求 1.A、B两个进程(亲缘关系),A进程往消息队列写入任意字符串

1K10

进程间通讯(七).socket(3)

用户调用socket函数之后,返回一个套接字sockfd. sockfd默认一个主动连接的套接字,也就是此时系统假设用户会对这个套接字调用connect函数,期待它主动与其它进程连接,然后服务器编程...同样的,它也可以被设置为NULL 如果accept成功返回,则服务器与客户已经正确建立连接了,此时服务器通过accept返回的套接字来完成与客户的通信 返回:负描述字成功, -1失败 有人很远的地方通过一个侦听...recv会一直阻塞直到接收到数据,阻塞模式下如果没有数据就会返回,不会阻塞着读,因此需要循环读取) 可能错误 EAGAIN:套接字已标记为阻塞,而接收操作被阻塞或者接收超时 EBADF:sock不是有效的描述词...);==0 对方调用了close API来关闭连接 ;<0 发送失败,错误原因存于全局变量errno EBADF 参数s 合法的socket处理代码 EFAULT 参数中有一指针指向无法存取的内存空间...,错误码GetLastError() EBADF 参数sockfd 合法socket处理代码 EFAULT 参数serv_addr指针指向无法存取的内存空间 ENOTSOCK 参数sockfd为一文件描述词

97920

网络编程(二).UDP

memset(buf,0,sizeof(buf)); //将buf清零 do { if(-1 == (readbytes=read(fa,buf,sizeof(buf)))) //指定文件读取数据写到...if (-1 == (recvbytes=recvfrom(sfd,buf2,5,0,(struct sockaddr *)&server_sai,(socklen_t *)&addrlen))) //远端读取数据到...emacs@ubuntu:~/c$ 此时系统并没有开放9000端口 emacs@ubuntu:~/c$ netstat -anu | grep 9000 emacs@ubuntu:~/c$ 运行服务端...socket处理代码 EFAULT 参数中有一指针指向无法存取的内存空间 ENOTSOCK 参数s为一文件描述词,socket EINTR 被信号所中断 EAGAIN 此动作会令进程阻断,但参数s的socket.../accept时确定 5.UDP:sendto/recvfrom函数每次均 需指定地址信 6.UDP:shutdown函数无效 TCP与UDP区别总结 1.TCP面向连接(如打电话要先拨号建立连接

63220

网络编程(一).TCP(3)

用户调用socket函数之后,返回一个套接字sockfd. sockfd默认一个主动连接的套接字,也就是此时系统假设用户会对这个套接字调用connect函数,期待它主动与其它进程连接,然后服务器编程...同样的,它也可以被设置为NULL 如果accept成功返回,则服务器与客户已经正确建立连接了,此时服务器通过accept返回的套接字来完成与客户的通信 返回:负描述字成功, -1失败 有人很远的地方通过一个侦听...recv会一直阻塞直到接收到数据,阻塞模式下如果没有数据就会返回,不会阻塞着读,因此需要循环读取) 可能错误 EAGAIN:套接字已标记为阻塞,而接收操作被阻塞或者接收超时 EBADF:sock不是有效的描述词...);==0 对方调用了close API来关闭连接 ;<0 发送失败,错误原因存于全局变量errno EBADF 参数s 合法的socket处理代码 EFAULT 参数中有一指针指向无法存取的内存空间...,错误码GetLastError() EBADF 参数sockfd 合法socket处理代码 EFAULT 参数serv_addr指针指向无法存取的内存空间 ENOTSOCK 参数sockfd为一文件描述词

40810

linux——管道详解

使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。...读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。...当数据写入内存之后,内存被解锁,而所有休眠索引节点的读取进程会被唤 醒。 管 道的读取过程和写入过程类似。...专门为每个管道所使用的内核级缓冲区确切为 4096 字节。 除非阅读器清空管道,否则一次超过 4K 的写操作将被阻塞。 实际上这算不上什么限制,因为读和写操作是不同的线程实现的。...Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较 Linux 的命名管道和 Windows 的命名管道。我写了另一个 Linux 上使用命名管道的程序。

2.9K20

UNIX(进程间通信):09 管道到底是什么

使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。...如果同时满足上述条件,写入函数首先锁定内存,然后写进程的地址空间中复制数据到内存。否则,写入进程就休眠 VFS 索 引节点的等待队列,接下来,内核将调用调度程序,而调度程序会选择其他进程运行。...但是,进程可以没有数据或内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件或管道的打开模式。反之,进程可 以休眠索引节点的等待队列中等待写入进程写入数据。...专门为每个管道所使用的内核级缓冲区确切为 4096 字节。除非阅读器清空管道,否则一次超过 4K 的写操作将被阻塞。实际上这算不上什么限制,因为读和写操作是不同的线程实现的。...Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较 Linux 的命名管道和 Windows 的命名管道。我写了另一个 Linux 上使用命名管道的程序。

1.2K10
领券