diff -rdup postgresql-9.4beta2/src/backend/bootstrap/bootstrap.c postgresql-9.4beta2_qnx/src/backend/bootstrap/bootstrap.c
--- postgresql-9.4beta2/src/backend/bootstrap/bootstrap.c	2014-07-21 15:07:50.000000000 -0400
+++ postgresql-9.4beta2_qnx/src/backend/bootstrap/bootstrap.c	2014-08-14 11:02:14.000000000 -0400
@@ -352,6 +352,11 @@ AuxiliaryProcessMain(int argc, char *arg
 	SetProcessingMode(BootstrapProcessing);
 	IgnoreSystemIndexes = true;
 
+
+	/* obtain shared file-based locks (or FATAL error) */
+	CreateDataDirLockFiles(false);
+
+
 	/* Initialize MaxBackends (if under postmaster, was done already) */
 	if (!IsUnderPostmaster)
 		InitializeMaxBackends();
diff -rdup postgresql-9.4beta2/src/backend/postmaster/postmaster.c postgresql-9.4beta2_qnx/src/backend/postmaster/postmaster.c
--- postgresql-9.4beta2/src/backend/postmaster/postmaster.c	2014-07-21 15:07:50.000000000 -0400
+++ postgresql-9.4beta2_qnx/src/backend/postmaster/postmaster.c	2014-08-14 11:03:25.000000000 -0400
@@ -881,6 +881,9 @@ PostmasterMain(int argc, char *argv[])
 	 */
 	CreateDataDirLockFile(true);
 
+	/* postmaster gets exclusive file-based locks then holds shared lock (or FATAL error) */
+	CreateDataDirLockFiles(true);
+
 	/*
 	 * Initialize SSL library, if specified.
 	 */
diff -rdup postgresql-9.4beta2/src/backend/tcop/postgres.c postgresql-9.4beta2_qnx/src/backend/tcop/postgres.c
--- postgresql-9.4beta2/src/backend/tcop/postgres.c	2014-07-21 15:07:50.000000000 -0400
+++ postgresql-9.4beta2_qnx/src/backend/tcop/postgres.c	2014-08-14 11:01:31.000000000 -0400
@@ -3679,6 +3679,9 @@ PostgresMain(int argc, char *argv[],
 		/* Initialize MaxBackends (if under postmaster, was done already) */
 		InitializeMaxBackends();
 	}
+	
+	/* obtain shared file-based locks (or FATAL error) */
+	CreateDataDirLockFiles(false);
 
 	/* Early initialization */
 	BaseInit();
diff -rdup postgresql-9.4beta2/src/backend/utils/init/miscinit.c postgresql-9.4beta2_qnx/src/backend/utils/init/miscinit.c
--- postgresql-9.4beta2/src/backend/utils/init/miscinit.c	2014-07-21 15:07:50.000000000 -0400
+++ postgresql-9.4beta2_qnx/src/backend/utils/init/miscinit.c	2014-08-14 11:19:14.000000000 -0400
@@ -47,6 +47,8 @@
 
 
 #define DIRECTORY_LOCK_FILE		"postmaster.pid"
+#define DIRECTORY_LOCK_FCNTL	"postmaster.fcntl"
+#define DIRECTORY_LOCK_PIPE		"postmaster.pipe"
 
 ProcessingMode Mode = InitProcessing;
 
@@ -1257,3 +1259,131 @@ pg_bindtextdomain(const char *domain)
 	}
 #endif
 }
+
+
+/*
+ * Create a lock using fcntl.
+ *
+ */
+void
+CreateDataDirLockFcntl(bool amPostmaster)
+{
+	int	fd = -1;
+	struct flock fl;
+
+	fd = open(DIRECTORY_LOCK_FCNTL, O_RDWR | O_CREAT, 0600);
+	if (fd < 0) 
+	{
+		ereport(FATAL,
+				(errcode_for_file_access(),
+				 errmsg("KBAKER process [%d] could not open fcntl lock file \"%s\": %m",
+						getpid(), DIRECTORY_LOCK_FCNTL)));
+	}
+
+	if (amPostmaster)
+	{
+		/* postmaster must start with exclusive lock to ensure no locks exist from old processes. */
+		fl.l_type = F_WRLCK;
+		fl.l_whence = SEEK_SET;
+		fl.l_start = 0;
+		fl.l_len = 0;
+
+		if (fcntl(fd, F_SETLK, &fl) == -1) 
+		{
+			ereport(FATAL,
+					(errcode_for_file_access(),
+					 errmsg("KBAKER process [%d] could not exclusive lock \"%s\": %m",
+							getpid(), DIRECTORY_LOCK_FCNTL)));
+			    
+		}
+
+		ereport(LOG,
+				(errmsg("KBAKER: process [%d] exclusive lock OK \"%s\"", getpid(), DIRECTORY_LOCK_FCNTL)));
+
+		/* postmaster continues to downgrade to read lock for lifetime of process, allowing other processes obtain read locks */
+	}
+	
+	/* obtain read lock, to be held for lifetime of process. */
+	fl.l_type = F_RDLCK;
+	fl.l_whence = SEEK_SET;
+	fl.l_start = 0;
+	fl.l_len = 0;
+
+	if (fcntl(fd, F_SETLK, &fl) == -1) 
+	{
+		ereport(FATAL,
+				(errcode_for_file_access(),
+				 errmsg("KBAKER process [%d] could not share lock \"%s\": %m",
+						getpid(), DIRECTORY_LOCK_FCNTL)));
+	}
+
+	ereport(LOG,
+			(errmsg("KBAKER: process [%d] share lock OK \"%s\"", getpid(), DIRECTORY_LOCK_FCNTL)));
+}
+
+/*
+ * Create a lock using pipe.
+ *
+ */
+void
+CreateDataDirLockPipe(bool amPostmaster) 
+{
+	int	fd_read = -1;
+	int	fd_write = -1;
+
+	/* create the pipe if not there */
+	mkfifo(DIRECTORY_LOCK_PIPE, 0600);
+
+	if (amPostmaster)
+	{
+		/* try to open pipe for write nonblock.  error with ENXIO indicates no readers, which is good. */
+		fd_write = open(DIRECTORY_LOCK_PIPE, O_WRONLY | O_NONBLOCK);
+
+		if (!((fd_write < 0) && (errno == ENXIO)))
+		{
+			ereport(FATAL,
+					(errcode_for_file_access(),
+					 errmsg("KBAKER process [%d] no ENXIO upon open for write PIPE lock file \"%s\": %m",
+							getpid(), DIRECTORY_LOCK_PIPE)));
+		}
+
+		if (fd_write > -1)
+		{
+			close(fd_write);
+		}
+		ereport(LOG,
+			(errmsg("KBAKER: process [%d] ENXIO check OK \"%s\"", getpid(), DIRECTORY_LOCK_PIPE)));
+	}
+
+	/* open pipe for read forever, so other processes know someone is active */
+	fd_read = open(DIRECTORY_LOCK_PIPE, O_RDONLY | O_NONBLOCK);
+
+	if (fd_read < 0) 
+	{
+		ereport(FATAL,
+				(errcode_for_file_access(),
+				 errmsg("KBAKER process [%d] could not open for read PIPE lock file \"%s\": %m",
+						getpid(), DIRECTORY_LOCK_PIPE)));
+	}
+
+	ereport(LOG,
+			(errmsg("KBAKER: process [%d] open for read OK \"%s\"", getpid(), DIRECTORY_LOCK_PIPE)));
+
+}
+
+/*
+ * Create lock files
+ *
+ */
+void
+CreateDataDirLockFiles(bool amPostmaster) 
+{
+	/* first obtain fcntl-based lock.  
+	 * Look could be accidentally broken by random backend code open/close of the lock file,
+	 * but should hold until postmaster obtains secure pipe-based lock.
+	 * This prevents race condition of 2 postmasters starting at same time. */
+	CreateDataDirLockFcntl(amPostmaster);
+
+	/* now create the more secure pipe-based lock */
+	CreateDataDirLockPipe(amPostmaster);
+}
diff -rdup postgresql-9.4beta2/src/include/miscadmin.h postgresql-9.4beta2_qnx/src/include/miscadmin.h
--- postgresql-9.4beta2/src/include/miscadmin.h	2014-07-21 15:07:50.000000000 -0400
+++ postgresql-9.4beta2_qnx/src/include/miscadmin.h	2014-08-14 10:45:29.000000000 -0400
@@ -425,6 +425,9 @@ extern char *local_preload_libraries_str
 #define LOCK_FILE_LINE_SHMEM_KEY	7
 
 extern void CreateDataDirLockFile(bool amPostmaster);
+extern void CreateDataDirLockFiles(bool amPostmaster);
+extern void CreateDataDirLockFcntl(bool amPostmaster);
+extern void CreateDataDirLockPipe(bool amPostmaster);
 extern void CreateSocketLockFile(const char *socketfile, bool amPostmaster,
 					 const char *socketDir);
 extern void TouchSocketLockFiles(void);
