diff --git a/SystemTools.cxx b/SystemTools.cxx
index 97dd4ae57b7faf3218a7e5bb6d3de1954f60c12b..8c82ec17b54b6ca4f8bd8142065889243c9bba66 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -3067,6 +3067,28 @@ bool SystemTools::FileIsSymlink(const std::string& name)
 #endif
 }
 
+bool SystemTools::FileIsFIFO(const std::string& name)
+{
+#if defined(_WIN32)
+  HANDLE hFile =
+    CreateFileW(Encoding::ToWide(name).c_str(), GENERIC_READ, FILE_SHARE_READ,
+                NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+  if (hFile == INVALID_HANDLE_VALUE) {
+    return false;
+  }
+  const DWORD type = GetFileType(hFile);
+  CloseHandle(hFile);
+  return type == FILE_TYPE_PIPE;
+#else
+  struct stat fs;
+  if (lstat(name.c_str(), &fs) == 0) {
+    return S_ISFIFO(fs.st_mode);
+  } else {
+    return false;
+  }
+#endif
+}
+
 #if defined(_WIN32) && !defined(__CYGWIN__)
 bool SystemTools::CreateSymlink(const std::string&, const std::string&)
 {
diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in
index f3d06fe570e4779df2b31388a1103c79a4623f66..7a5256b236fc94c035bff7285d6e73b266909703 100644
--- a/SystemTools.hxx.in
+++ b/SystemTools.hxx.in
@@ -653,6 +653,11 @@ public:
    */
   static bool FileIsSymlink(const std::string& name);
 
+  /**
+   * Return true if the file is a FIFO
+   */
+  static bool FileIsFIFO(const std::string& name);
+
   /**
    * Return true if the file has a given signature (first set of bytes)
    */