[英]crash when using FILE descriptor with popen across unix file system
我們有一段舊代碼,將Flex與C樣式FILE *描述符一起使用。 為了支持將壓縮文件讀取到Flex中,我們擴展了“ open”語義,以使用以下命令打開gzip文件
FILE* file = popen("gzip -cd <filename>");
而不是fopen
。
我們最近遇到了一些問題,在整個UNIX文件系統(可能是在NetApp上使用NFS掛載的另一個文件系統)上進行嘗試導致整個代碼流崩潰(segfault),我們看到的第一條消息是
gzip:標准輸出:斷管
和我們自己的崩潰框架。 如果我們獲取文件並將其移動到運行該進程的本地文件系統中,則不會出現段錯誤,並且一切正常。
我們試圖復制或修復哪些內容?
所有這些都成功了,但我們仍然遇到崩潰。
我們沒有想法,可以使用一些建議。
山姆·阿普爾頓
測試時,SIGPIPE具有其默認操作(殺死gzip進程)。 當該過程在您的客戶端運行時,SIGPIPE被屏蔽。 這是再現錯誤的最小程序:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#define SZ 4096
void mask()
{
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sa.sa_flags = 0;
if (-1 == sigaction(SIGPIPE, &sa, 0))
{
perror("sigaction");
exit(1);
}
}
int main(int argc, char ** argv)
{
char buf[SZ];
#ifdef MASK
mask();
#endif
FILE * f = popen("gzip -dc foo.gz", "r");
if (0 != fread(buf, SZ, 1, f))
{
fwrite(buf, SZ, 1, stdout);
}
fprintf(stderr, "%d\n", pclose(f));
}
這是帶有和不帶有掩碼的輸出:
$ gcc -o foo foo.c
$ gcc -DMASK -o foomask foo.c
$ /foo > /dev/null
13
$ /foomask > /dev/null
gzip: stdout: Broken pipe
256
$
簡而言之,它與NFS無關。 那是一條紅鯡魚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.