我对管道的一些基本问题,我不确定。

一)什么是标准的行为,如果一个进程写入管道就会被杀死(即SIGKILL SIGINT)是否关闭管道?是否冲洗管?或行为未定义?

b)当标准行为如果一个进程通常返回?难道是保证冲洗管道和关闭管道? (但没有明确这样做的过程中)。

我想这些答案要尽可能通用,但在现实中,如果它完全取决于OS的规格我可以接受!但是,如果有一个POSIX标准或当前定义的Windows行为,我将非常感激就知道了。

感谢。

有帮助吗?

解决方案

  

一个。什么是标准的行为,如果一个进程写入管道就会被杀死(即SIGKILL SIGINT)是否关闭管道?是否冲洗管?或行为未定义?

SIGKILL从未允许任何清理 - 进程死亡,死亡。随着SIGINT,这取决于进程是否处理信号。如果是的话,则有可能经由出口(2),该冲洗标准I / O的文件句柄退出。问题是 - 是在配管连接到标准输出或经由POPEN()?如果是这样,突出的缓冲数据的可能冲洗;如果不是,不存在缓冲数据,以便冲洗是无关紧要的。

如果有在管的未读数据时,该数据仍然在管,准备为读者收集 - 假设有一个读取器

  

湾什么是标准的行为,如果一个进程通常会返回?难道是保证冲洗管道和关闭管道? (但没有明确这样做的过程中)。

这取决于管是否是经由标准I / O或不连接。如果不是,有什么待定。如果是这样,那么,在缓冲器的任何材料将被刷新为I / O流关闭的标准。


  

℃。感谢您的信号和未读数据的信息,但我有点困惑的标准I / O管道连接。之后你提到的popen()我看着它,该名男子页说,它的返回值相同的I / O流和数据流是默认全缓冲。我只是没有在两者之间的差别清晰,也不做我理解其中的差异从何而来。

的基本系统调用用于创建管道是pipe(2)。它创建两个文件描述符,一个用于管道,一个用于写端的读端。如果你什么也不做与他们,那么他们仍然文件描述符,与无缓冲输出(通过写(2)和相关的系统调用)。如果该过程终止,则在应用程序中没有缓冲;在管道关闭。

如果您使用popen(3),那么它就是一大堆更多的为你工作。这仍引发pipe(2)创造了管道,但随后做了fork(2)。孩子安排管道的正确配置和启动子进程。母体也关闭管道的未使用端,并且使用fdopen(3)创建调用进程使用标准I / O的文件流。

使用文件流,如果有在I / O缓冲器的数据,然后密切或等效将确保未完成的数据进行冲洗和文件描述符被关闭。

其他提示

的正常行为是,当一个进程终止所有文件描述符被关闭。这意味着,管,像任何其他打开文件描述符,通常是关闭的。

有关管道的一个有趣的事情,但:在POSIX,如果一个进程写入已关闭的管道,作家会得到一个信号,SIGPIPE。


编辑:

一个警告:SIGx终止和正常结束s之间的差异在于,像任何其他文件的写入,则可能会失去已缓冲(经由文件写)和尚未写入文件描述符数据

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top