簡體   English   中英

在unix文件系統中使用帶有popen的FILE描述符時崩潰

[英]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:標准輸出:斷管

和我們自己的崩潰框架。 如果我們獲取文件並將其移動到運行該進程的本地文件系統中,則不會出現段錯誤,並且一切正常。

我們試圖復制或修復哪些內容?

  • 從內部測試NFS文件系統中讀取使用gzip / bzip2等壓縮的文件
  • 驗證可以打開目標文件
  • “打開”文件並讀取一些字節,以確保可以通過此過程將其打開

所有這些都成功了,但我們仍然遇到崩潰。

我們沒有想法,可以使用一些建議。

山姆·阿普爾頓

測試時,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM