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

Cygwin -打开指定的fifo时阻塞会导致另一个线程在打开常规文件时阻塞

Cygwin是一个在Windows操作系统上运行类Unix环境的开源软件。它提供了一套完整的GNU工具集,包括shell、编译器、调试器等,使得开发人员可以在Windows平台上进行类Unix环境下的开发工作。

在Cygwin中,fifo是一种特殊的文件类型,也称为命名管道。它是一种用于进程间通信的机制,允许不相关的进程通过读写同一个fifo文件来进行数据交换。fifo文件在文件系统中以特殊的文件类型存在,可以像普通文件一样进行打开、读写操作。

根据提供的问题描述,当一个线程在Cygwin中打开指定的fifo文件时发生阻塞,可能会导致另一个线程在打开常规文件时也发生阻塞。这种情况可能是由于以下原因导致的:

  1. 竞争条件:多个线程同时尝试打开同一个fifo文件,由于资源竞争导致其中一个线程被阻塞。

为了解决这个问题,可以考虑以下方法:

  1. 使用互斥锁:在多个线程之间对共享资源进行互斥访问,确保同一时间只有一个线程可以打开fifo文件。
  2. 使用非阻塞模式:在打开fifo文件时,可以将文件描述符设置为非阻塞模式,这样当没有数据可读或可写时,读写操作将立即返回,而不是阻塞等待。
  3. 使用异步IO:使用异步IO操作可以在进行文件读写时不阻塞线程,提高程序的并发性能。

总结起来,Cygwin是一个在Windows操作系统上运行类Unix环境的开源软件,fifo是一种特殊的文件类型,用于进程间通信。当在Cygwin中打开指定的fifo文件时发生阻塞可能是由于竞争条件导致的。为了解决这个问题,可以使用互斥锁、非阻塞模式或异步IO等方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

UNIX IPC

如果用读写方式(O_RDWR)打开,则不会导致阻塞; 如果以只读(O_RDONLY)方式打开,则调用 open() 函数进程会被阻塞直到有写方打开管道 如果以写方式(O_WRONLY)打开,也阻塞直到有读方打开管道...注意以下例子, 两个进程打开管道顺序是相方, 否则就会导致死锁, 永远阻塞。..., 阻塞等待另一个进程打开写 int pip_read = open(WRITE_PATH, O_RDONLY); // 打开写后, 同样需要阻塞直到另一个进程打开读...发送消息时候, 传递给函数长度是实际发送数据大小长度,但是,调用接收函数,传递长度是消息最大长度,也就是创建消息队列设置长度,否则会导致接收消息失败。.../*mode_t mode, unsigned int value*/); 信号量打开后,进程退出自动关闭。

1.4K20

FIFO:不是文件文件

;而PIPE不与文件系统相关联,创建PIPE后直接读写(pipe),无需打开; 2) PIPE只能在父子关系进程间使用,本质是通过fork复制了母进程空间从而扩展到另一个进程;而FIFO关联各个进程间更为自由...但他们都是管道,本质上就是内核开辟一块缓存区,虽然FIFO文件系统有一个入口,但是它和文件有很大不同,具体体现在使用FIFO文件接口几个限制上: 1) 如果读进程以只读方式打开FIFO,若此时还没有写进程打开...FIFO,则读进程阻塞在open上,直到有进程以写方式打开FIFO文件; 2) 如果写进程以只写方式打开FIFO,若此时还没有读进程打开FIFO,则写进程阻塞在open上,直到有进程以读方式打开FIFO...6 /* No such device or address */); 一般很少用读写方式打开FIFO,因为那样很容易读到自己写入数据,除非此FIFO就是用来进程内部多个线程之间使用。...除此之外,FIFO在读写进程退出表现,也与PIPE相似,而与文件不同: 1) 当所有读进程退出后,写进程再写入数据会收到SIGPIPE信号; 2) 当所有写进程退出后,读进程再读取数据read返回

79330
  • 进程间通信

    如下图: 二、FIFO FIFO,也称为命名管道,它是一种文件类型。 1、特 FIFO可以无关进程之间交换数据,与无名管道不同。...一旦创建了一个 FIFO,就可以用一般文件I/O函数操作它。...当 open 一个FIFO,是否设置非阻塞标志(O_NONBLOCK)区别: 若没有指定O_NONBLOCK(默认),只读 open 要阻塞到某个其他进程为写而打开FIFO。...类似的,只写 open 要阻塞到某个其他进程为读而打开它。 若指定了O_NONBLOCK,则只读 open 立即返回。...,另一个进程要注意读写问题,相当于线程线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内一块内存

    89420

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

    进程间通信必须通过内核提供通道,而且必须有一种办法进程中标识内核提供某个通道,前面讲过匿名管道是用打开文件描述符来标识。...各进程可以打开这个文件进行read/write,实际上是在读写内核通道(根本原因在于这个file结构体所指向read、write函数和常规文件不一样),这样就实现了进程间通信。...三、命名管道打开规则 如果当前打开操作是为读而打开FIFO O_NONBLOCK disable:阻塞直到有相应进程为写而打开FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开...FIFO O_NONBLOCK disable:阻塞直到有相应进程为读而打开FIFO O_NONBLOCK enable:立刻返回失败,错误码为ENXIO 需要注意打开文件描述符默认是阻塞...非阻塞也不难测试,open增加标志位就可以了。 需要注意是 命令管道与匿名管道读写规则是一样,参见这里。

    3.7K60

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

    FIFO比pipe函数打开时候多了一个打开操作open;如果当时打开操作为读而打开FIFO,若已经有相应进程为写而打开FIFO,则当前打开操作将返回成功;否则,可能阻塞到有相应进程为写而打开FIFO...另一种情况就是为写而打开FIFO,若已经有相应进程为读而打开FIFO,则当前打开操作将成功返回;否则可能阻塞直到有相应进程为读而打开FIFO;或者,返回ENIO错误。...接下来,先运行fifo_write,然后打开另一个终端,接着运行fifo_read,运行fifo_write时候,可以看到程序阻塞在终端: ?...下面打开另外一个终端运行fifo_read 切换到另外一个终端,终端输入ls –l可以看到由于fifo_write中创建了管道文件txt,从前面的字串prwxr-xr-x中p可以知道,这是一个管道文件...如试图读取空FIFO,将导致进程阻塞; 2、使用O_NONBLOCK:访问要求无法满足阻塞,立即出错返回,errno是ENXIO。

    2.4K10

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

    当进程结束,操作系统回收其占用所有资源,包括打开文件、管道、网络连接等 我们之前命令行里使用|其实就是匿名管道:命令行中,当我们使用|来连接两个命令,实际上是在这两个命令之间创建了一个匿名管道...当另一个进程也打开同一个文件,内核会为该进程创建另一个struct file结构体,其中也包含指向相同inode结构体和缓冲区指针。...在打开命名管道,进程需要指定相应读写权限。 读写数据: 进程可以通过打开文件描述符对命名管道进行读写操作。一个进程往管道中写入数据,另一个进程从管道中读取数据。...阻塞模式下,read 函数阻塞等待直到有数据可读取或者发生错误,它不会因为读取到文件末尾而返回 0。相反,只有当管道被关闭或者读取操作被中断,read 函数才会返回 0。...默认都是阻塞模式 文件描述符阻塞模式和非阻塞模式指的是进行I/O操作行为方式。

    39320

    一文快速了解进程、线程与协程

    TGID是启动整个进程threadPID。 例如,当一个进程被创建时候,它其实是一个PID和TGID数值相同线程。当线程A启动线程B线程B会有自己唯一PID,但它TGID从A继承而来。...2.命名管道(namedpipe) FIFO,也称为命名管道,它是一种文件类型,也是半双工通信方式。多个进程都可以通过一个约定好名字找到同一个管道。FIFO允许无亲缘关系进程间通信。...FIFO通信方式类似于进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道特性。在数据读出FIFO管道中同时清除数据,并且“先进先出”。 ?...,速度快,但要保持同步,比如一个进程时候,另一个进程要注意读写问题,相当于线程线程安全问题。...而进入阻塞可以看成是一个主动行为(eg.进程I/O,进程等待I/O设备完成,进程主动进入阻塞状态,I/O完成,进程被激活) 挂起态可以分为下面两种: 阻塞挂起状态:进程在外存(磁盘)并等待某个事件出现

    14.1K61

    Linux进程通信——有名管道

    可以看到,它以P开头,表面它是一个FIFO文件。它是真实存在于磁盘上,不仅仅在内存中。进程结束了这个文件仍然FIFO和匿名管道一样,默认下要考虑阻塞。...当使用O_NONBLOCK标志时候,打开FIFO文件,读取操作立即返回。但是如果没有进程读取FIFO文件,那么写入FIFO操作返回ENXIO错误代码。...管道这个名字是非常形象,一个管道必须有两端(就是一个进程中必须读,另一个进程必须写),只有这样,才能正常操作,否则进程将会阻塞。例如下面这样。...等我们把test1也运行了之后,test2不在阻塞,向屏幕打印Hello. 如果我们不想让FIFO阻塞,那么打开文件时候设置为可读可写即可。...调用 write() 函数向 FIFO 里写数据,当缓冲区已满 write() 也阻塞。 通信过程中,读进程退出后,写进程向命名管道内写数据,写进程也退出。

    3.3K30

    进程间通信和线程间通信区别_有些线程包含多个进程

    3.信号阻塞 有时候既不希望进程接收到信号立刻中断进程执行,也不希望此信号完全被忽略掉,而是希望延迟一段时间再去调用信号处理函数,这个时候就需要信号阻塞来完成。...一旦建立,任何进程都可以通过文件名将其打开和进行读写,而不局限于父子进程,当然前提是进程对FIFO有适当访问权。当不再被进程使用时,FIFO在内存中释放,但磁盘节点仍然存在。...使用open()函数通过文件名可以打开已经创建命名管道,而无名管道不能由open来打开。当一个命名管道不再被任何进程打开,它没有消失,还可以再次被打开,就像打开一个磁盘文件一样。...共享内存中内容往往是解除映射才写回文件,因此,采用共享内存通信方式效率非常高。...(fotk函数消息队列部分已经用过了, 根据pathname指定文件(或目录)名称,以及proj参数指定数字,ftok函数为IPC对象生成一个唯一性键值。)

    1.1K30

    【进程间通信】IPC、管道pipe、命名管道FIFO

    并且这两个文件描述符使用时候不需要open()打开,但是需要我们手动close()关闭。 管道创建成功后,父进程同时拥有读写两端,因为子进程是对父进程复制,所以子进程也拥有读写两端。...解决方法就是,我们进程间通信,要保证数据单向流通,在读进程中关闭管道写端文件描述符,写进程中关闭管道读端文件描述符。我们依据这个原则来改造一下上面的程序即可。...(讲信号时候细说) 如果有指向管道读端文件描述符没关闭(管道读端引用计数大于0),而持有管道读端进程也没有从管道中读数据,这时有进程向管道写端写数据,那么管道被写满再次write阻塞,直到管道中有空位置了才写入数据并返回...(可以把FIFO理解为一个文件,一个进程向该文件写数据,另一个进程从该文件中读书数据,前提是两个进程读写是同一个FIFO文件才能实现通信) 2....(也可以开启多个写进程去写,读者可自行测试) 我们在读写FIFO时候都使用了open()函数,使用open函数时候有一个注意事项,使用open打开FIFO文件时候,read端阻塞等待write端

    11610

    Linux进程间通信(一) - 管道

    由于Linux中所有的事物都可被视为文件,所以对命名管道使用也就变得与文件操作非常统一,也使它使用非常方便,同时我们也可以像平常文件名一样命令中使用。...很简单,对于以只读方式(O_RDONLY)打开FIFO文件,如果open调用是阻塞(即第二个参数为O_RDONLY),除非有一个进程以写方式打开同一个FIFO,否则它不会返回;如果open调用是非阻塞...对于以只写方式(O_WRONLY)打开FIFO文件,如果open调用是阻塞(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open调用是非阻塞.../ipc_fifo_writer Process 74640 opening FIFO O_WRONLY // 这里阻塞住,直到ipc_fifo_reader调用open打开同一个fifo Process.../ipc_fifo_writer早已运行,即早有另一个进程以写方式打开同一个FIFO,所以open调用立即返回。

    3K70

    进程间通信

    ,则read返回0 如果所有管道读端对应文件描述符被关闭,则write操作产生信号SIGPIPE,进而可能导致write进程退出 当要写入数据量不大于PIPE_BUF,linux将保证写入原子性...命名管道 管道应用一个限制就是只能在具有共同祖先进程间通信。 如果我们想在不相关进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。...命名管道由mkfifo函数创建,打开用open FIFO(命名管道)与pipe(匿名管道)之间唯一区别在它们创建与打开方式不同,一但这些工作完成之后,它们具有相同语义。...命名管道打开规则 如果当前打开操作是为读而打开FIFO O_NONBLOCK disable:阻塞直到有相应进程为写而打开FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开...FIFO O_NONBLOCK disable:阻塞直到有相应进程为读而打开FIFO O_NONBLOCK enable:立刻返回失败,错误码为ENXIO system V共享 共享内存区是最快

    1K20

    本文帮你Unix玩转C语言

    system函数是exec外包了一层。 execlp要求参数以null结束,换行符不可以 线程id只它所属进程内起作用,另一个进程中无意义,可以使用线程id引用相应线程。...进程终止内核自动关闭它打开文件。...FIFO 又名管道文件,shell里竖线 | 【用于进程间通信】 套接字【这种文件用于进程间网络通信,也可用于一台机上进程间非网络通信】 符号链接【这种文件类型指向另一个文件】 进程间通信(IPC...FILE *freopen(pathname, type, FILE *restrict fp)一个指定流上打开文件,若流已打开,先关闭流。...两种方法指定描述符为非阻塞IO:openO_NONBLOCK;fcntl(fd, cmd, &lock)打开 O_NONBLOCK标志。

    84210

    C++进程间通信 详解2

    一、概述 二、进程间通信概念及方法 Linux环境下,进程地址空间相互独立,每个进程各自有不同用户地址空间。任何一个进程全局变量另一个进程中都看不到,所以进程和进程之间不能相互访问。...4)如果有指向管道读端文件描述符没关闭(管道读端引用计数大于0),而持有管道读端进程也没有从管道中读数据,这时有进程向管道写端写数据,那么管道被写满再次write阻塞,直到管道中有空位置了才写入数据并返回...但通过FIFO,不相关进程也能交换数据。 FIFO是Linux基础文件类型中一种。但FIFO文件磁盘上没有数据块,仅仅用来标识内核中一条通道。...open注意事项,打开fifo文件时候,read端阻塞等待write端open,write端同理,也阻塞等待另外一端打开。 7....总结:使用mmap时务必注意以下事项: 创建映射区过程中,隐含着一次对映射文件读操作。 当MAP_SHARED,要求:映射区权限应 <=文件打开权限(出于对映射区保护)。

    59510

    unix环境高级编程(下)-高级IO和进程间通信篇

    io 如果调用open获得文件描述符,可指定O_NONBLOCK标识 对于已经打开文件描述符,可调用fcntl,由该函数打开O_NONBLOCK标识 2....IO多路转接 4.1 阻塞io 读取一个文件描述符对数据,如果没有数据就一直阻塞住 缺点:长时间阻塞在同一个文件描述符,另一个文件描述符虽然有很多数据却得不到及时处理 4.2 非阻塞io 将两个文件描述符都设置为非阻塞...时间每个字段为0:完全不等待,测试指定文件描述符并立即返回 不为0:实际等待时间 返回值: 返回-1:表示出错,文件描述符没有准备好收到信号,此时不修改文件描述符 返回0:已经超时了,指定文件描述符都没有准备好...mode参数与open函数一致 非阻塞标准O_NONBLOCK: 没有指定该参数:只读open要阻塞到某个其他进程为写而打开FIFO 指定该参数:只读open立即返回。...没有进程打开FIFO,将出错返回-1 类似与管道,若write写一个尚无进程为读而打开FIFO,产生SIGPIPE信号。

    1.5K42

    操作系统-进程

    调度 线程是独立调度基本单位,同一进程中,线程切换不会引起进程切换,从一个进程中线程切换到另一个进程中线程,会引起进程切换。...进行进程切换,涉及当前执行进程 CPU 环境保存及新调度进程 CPU 环境设置,而线程切换只需保存和设置少量寄存器内容,开销很小 通信区别: 线程间:通过直接读写同一进程中数据进行通信...消费者不能进入临界区,因为生产者对缓冲区加锁了,消费者就无法执行 up(empty) 操作,empty 永远都为 0,导致生产者永远等待下,不会释放锁,消费者因此也永远等待下去。...五个概念:管道、FIFO、消息队列、信号量、共享存储、套接字 1.管道(匿名管道) 定义: 把一个进程连接到另一个进程一个数据流成为一个"管道"; 用途: 把一个进程输出通过管道连接到另一个进程输入...3.消息队列 优点(与FIFO比较) 消息队列可以独立于读写进程存在,避免了 FIFO 中同步管道打开和关闭可能产生困难; 避免了 FIFO 同步阻塞问题,不需要进程自己提供同步方法; 读进程可以根据消息类型有选择地接收消息

    62620

    Java多线程系列--阻塞队列BlockingQueue用法

    队列类型 说明 ArrayBlockingQueue 基于数组FIFO队列;有界;创建必须指定大小; 入队和出队共用一个可重入锁。默认使用非公平锁。...默认大小LinkedBlockingQueue将导致所有 corePoolSize 线程都忙时新任务队列中等待。这样,创建线程不会超过 corePoolSize。...如果队列己满:阻塞当前线程,直到队列有空闲插入成功后返回。 如果在阻塞被其他线程设置了中断标志:被阻塞线程抛出InterruptedException异常而返回。...poll(long timeout, TimeUnit unit) 从BlockingQueue取出(删除对象)一个队首对象。 一旦指定时间内有数据可取,则立即返回队列中数据。...如果队列为空则阻塞当前线程直到队列不为空然后返回元素; 如果在阻塞被其他线程设置了中断标志,则被阻塞线程抛出InterruptedException异常而返回。

    48530

    Linux命令mkfifo深度解析

    Linux命令mkfifo深度解析一、引言Linux操作系统中,mkfifo是一个非常重要命令,它用于创建命名管道(named pipe),也称为FIFO(First In First Out)文件...与普通文件不同,命名管道不提供数据持久存储,而是作为一个通道,实现进程间数据传递。当一个进程向命名管道写入数据另一个进程可以从该管道中读取数据,从而实现进程间通信。...阻塞/非阻塞模式:当使用open()函数打开命名管道,可以设置阻塞或非阻塞模式。阻塞模式下,如果管道中没有数据可读或没有进程写入数据,则读取或写入操作会被阻塞,直到条件满足。...而在非阻塞模式下,如果管道中没有数据可读或没有进程写入数据,则读取或写入操作立即返回错误。权限控制:与普通文件一样,命名管道也具有访问权限。通过mkfifo命令-m参数,可以指定命名管道权限。...错误处理:使用mkfifo命令,要注意检查返回值和错误码,以便及时发现和处理可能出现错误。例如,如果指定文件已存在或没有权限创建文件,mkfifo命令返回错误码并设置相应errno值。

    25110

    Linux进程通信

    Linux系统中专门设置了一种特殊系统文件-管道文件——FIFO文件形式存在于文件系统中,这样,即使与FIFO创建进程不存在亲缘关系进程,只要可以访问该路径,就可以通过FIFO进行彼此间通信...用open函数打开命名管道要注意亮点: 不能以O_RDWR模式打开命名管道FIFO文件,否则其行为是未定义管道是单向,不能同时读写; 传递给open调用FIFO路径名,而不是正常文件 打开...2.2 有名信号量 2.2.1 概念和相关知识 用于进程(线程)间同步互斥。 有名信号量必须指定一个相关联文件名称,名称通常是文件系统中某个文件,无名信号量不需要指定。...无名信号量持续性却是不定:如果无名信号量是由单个进程内各个线程共享,那么该信号量就是随进程持续,当该进程终止它也消失。...返回值:成功Server用于与Client进行数据传输文件描述符;失败返回-1,相应地设定全局变量errno。 accept是阻塞函数,服务器端一直阻塞到有一个客户程序发出了连接。

    1.9K20

    Java并发工具篇

    **CyclicBarrier**:循环栅栏,类似倒计时器,但是比他更高级,也是用来阻塞线程(只不过阻塞方式不同,下面会具体介绍) **Semaphore**:信号量,用来控制多个线程同时访问指定资源...,栅栏才会打开 如果有定义栅栏动作,那么当栅栏打开执行栅栏动作 **栅栏动作就是:栅栏打开后需执行动作,通过构造函数Runnable参数指定,可选参数**,下面会介绍 这个属于循环栅栏和倒计数器...就是上面我们说栅栏动作,即当最后一个线程也被阻塞,就会触发这个栅栏动作(这个参数可选,如果没有,则不执行任何动作) **等待**:public int await(),阻塞当前线程,直到最后一个线程阻塞...| 阻塞单个(多个)线程,以等待其他线程执行 | 多个线程之间相互阻塞 | 超过许可数,阻塞 | | 场景...| 阻塞单个(多个)线程,以等待其他线程执行 | 多个线程之间相互阻塞 | 超过许可数,阻塞 | | 场景

    47030
    领券