首页
学习
活动
专区
工具
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会返回

79630
  • 进程间通信

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

    89820

    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】进程间通信——命名管道

    > /path/to/your/fifo 需要注意的是,如果此时没有其他进程正在读取该命名管道,则上述命令将会阻塞,直到有读者出现。 从命名管道读取数据 另一个进程可以从命名管道中读取数据。...如果先打开Server可执行程序,Client可执行程序还未打开: Server进程会阻塞在打开命名管道文件那里直到Client可执行程序打开 命名管道的打开规则 • 如果当前打开操作是为读⽽打开FIFO...时 ◦ O_NONBLOCK disable(阻塞模式):阻塞直到有相应进程为写⽽打开该FIFO ◦ O_NONBLOCK enable(非阻塞模式):⽴刻返回成功 • 如果当前打开操作是为写⽽打开...FIFO时 ◦ O_NONBLOCK disable(阻塞模式):阻塞直到有相应进程为读⽽打开该FIFO ◦ O_NONBLOCK enable(非阻塞模式):⽴刻返回失败,错误码为ENXIO 上述命名管道的使用由先打开...Server可执行程序,Client可执行程序还未打开,Server进程会阻塞在打开命名管道文件说明当前命名管道是使用阻塞模式打开的 5.

    13710

    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操作时的行为方式。

    44320

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

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

    15.3K62

    Linux进程通信——有名管道

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

    3.3K30

    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

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

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

    1.2K30

    【Linux】IPC 进程间通信(一):管道(匿名管道&命名管道)

    当父进程要传输数据给子进程时,就可以只使用以写方式打开的文件的管道文件,关闭以读方式打开的文件, 同样的,子进程只是用以读方式打开的文件的管道文件,关闭掉以写方式打开的文件。...功能 mkfifo() 函数的作用是在文件系统中创建一个特殊类型的文件,该文件在外观上类似于普通文件,但实际上是一个FIFO,用于进程之间的通信。...4.5 命名管道的打开规则 如果当前打开操作是为读而打开FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开...FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO O_NONBLOCK enable:立刻返回失败,错误码为ENXIO 5....管道分为两种类型:无名管道和命名管道 无名管道主要用于具有亲缘关系的进程(如父子进程),在创建时不需要名称,只能通过文件描述符进行访问 命名管道(FIFO)则可以在任何进程之间通信,使用文件系统中的路径来标识

    13810

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

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

    16910

    本文帮你在Unix玩转C语言

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

    85610

    C++进程间通信 详解2

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

    82510

    Linux命令mkfifo深度解析

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

    31210

    操作系统-进程

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

    63220

    Linux进程通信

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

    1.9K20

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

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

    52530
    领券