diff --git a/src/include/pool.h b/src/include/pool.h
index ea6f87e12..65907dcf1 100644
--- a/src/include/pool.h
+++ b/src/include/pool.h
@@ -4,8 +4,8 @@
  * pgpool: a language independent connection pool server for PostgreSQL
  * written by Tatsuo Ishii
  *
- * Portions Copyright (c) 2003-2025	PgPool Global Development Group
- * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
+ * Portions Copyright (c) 2003-2026	PgPool Global Development Group
+ * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * Permission to use, copy, modify, and distribute this software and
@@ -709,6 +709,15 @@ extern bool pool_acquire_follow_primary_lock(bool block, bool remote_reques);
 extern void pool_release_follow_primary_lock(bool remote_reques);
 extern void pool_signal_logrotate(void);
 
+/*
+ * Close listening sockets
+ * following defines are for "kind" param.
+ */
+#define POOL_CLOSE_PGPOOL_LISTENING_SOCKS	0x01	/* pgpool sockets */
+#define POOL_CLOSE_PCP_LISTENING_SOCKS		0x02	/* pcp sockets */
+extern void close_listening_sockets(int kind);
+
+
 /* strlcpy.c */
 #ifndef HAVE_STRLCPY
 extern size_t strlcpy(char *dst, const char *src, size_t siz);
diff --git a/src/main/pgpool_main.c b/src/main/pgpool_main.c
index fa05e15e7..bf7c452e2 100644
--- a/src/main/pgpool_main.c
+++ b/src/main/pgpool_main.c
@@ -212,6 +212,7 @@ static struct sockaddr_un *pcp_un_addrs;	/* unix domain socket path for PCP */
 ProcessInfo *process_info = NULL;	/* Per child info table on shmem */
 volatile User1SignalSlot *user1SignalSlot = NULL;	/* User 1 signal slot on
 													 * shmem */
+
 int			current_child_process_count;
 
 /*
@@ -815,6 +816,9 @@ pcp_fork_a_child(int *fds, char *pcp_conf_file)
 		on_exit_reset();
 		SetProcessGlobalVariables(PT_PCP);
 
+		/* close pgpool listening sockets */
+		close_listening_sockets(POOL_CLOSE_PGPOOL_LISTENING_SOCKS);
+
 		close(pipe_fds[0]);
 		close(pipe_fds[1]);
 
@@ -862,6 +866,9 @@ fork_a_child(int *fds, int id)
 
 		SetProcessGlobalVariables(PT_CHILD);
 
+		/* close pcp listening sockets */
+		close_listening_sockets(POOL_CLOSE_PCP_LISTENING_SOCKS);
+
 		/* call child main */
 		POOL_SETMASK(&UnBlockSig);
 		health_check_timer_expired = 0;
@@ -909,6 +916,14 @@ worker_fork_a_child(ProcessType type, void (*func) (void *), void *params)
 
 		SetProcessGlobalVariables(type);
 
+		/*
+		 * Close pgpool listening sockets and pcp listening sockets if they
+		 * are already setup. They are not ncessary for woker process (health
+		 * check and streaming replication check process).
+		 */
+		close_listening_sockets(POOL_CLOSE_PGPOOL_LISTENING_SOCKS |
+								POOL_CLOSE_PCP_LISTENING_SOCKS);
+
 		ereport(LOG,
 				(errmsg("process started")));
 
@@ -5227,3 +5242,25 @@ select_victim_processes(int *process_info_idxs, int count)
 	}
 	return selected_count;
 }
+
+/*
+ * Close all listening sockets
+ *
+ * kind bitmap specifies which listening sockets to be closed.
+ */
+void
+close_listening_sockets(int kind)
+{
+	int			i;
+
+	if (kind & POOL_CLOSE_PGPOOL_LISTENING_SOCKS && fds != NULL)
+	{
+		for (i = 0; fds[i] > 0; i++)
+			close(fds[i]);
+	}
+	if (kind & POOL_CLOSE_PCP_LISTENING_SOCKS && pcp_fds != NULL)
+	{
+		for (i = 0; pcp_fds[i] > 0; i++)
+			close(pcp_fds[i]);
+	}
+}
diff --git a/src/watchdog/wd_lifecheck.c b/src/watchdog/wd_lifecheck.c
index 86caf9b4b..a6958a395 100644
--- a/src/watchdog/wd_lifecheck.c
+++ b/src/watchdog/wd_lifecheck.c
@@ -6,7 +6,7 @@
  * pgpool: a language independent connection pool server for PostgreSQL
  * written by Tatsuo Ishii
  *
- * Copyright (c) 2003-2025	PgPool Global Development Group
+ * Copyright (c) 2003-2026	PgPool Global Development Group
  *
  * Permission to use, copy, modify, and distribute this software and
  * its documentation for any purpose and without fee is hereby
@@ -367,6 +367,10 @@ fork_lifecheck_child(void)
 		on_exit_reset();
 		SetProcessGlobalVariables(PT_LIFECHECK);
 
+		/* close pgpool/pcp listening sockets */
+		close_listening_sockets(POOL_CLOSE_PGPOOL_LISTENING_SOCKS |
+								POOL_CLOSE_PCP_LISTENING_SOCKS);
+
 		/* call lifecheck child main */
 		POOL_SETMASK(&UnBlockSig);
 		lifecheck_main();
