[libc-commits] [libc] [libc] Implement killpg (PR #237561)

Anshitha Yeruva via libc-commits libc-commits at lists.llvm.org
Sun Nov 1 08:53:55 PST 2026


https://github.com/anshithayeruva updated https://github.com/llvm/llvm-project/pull/237561

>From 2ec131f7f769d35af9eec49dcfd6b9abcd17e9a4 Mon Sep 17 00:00:00 2001
From: anshithayeruva <anshithayeruva18 at gmail.com>
Date: Sat, 31 Oct 2026 18:32:49 +0530
Subject: [PATCH 1/3] [libc] Implement killpg (Part of #236167)

---
 libc/config/linux/aarch64/entrypoints.txt |  1 +
 libc/config/linux/riscv/entrypoints.txt   |  1 +
 libc/config/linux/x86_64/entrypoints.txt  |  1 +
 libc/include/signal.yaml                  |  7 +++++
 libc/src/signal/CMakeLists.txt            |  8 ++++--
 libc/src/signal/killpg.h                  | 21 ++++++++++++++
 libc/src/signal/linux/CMakeLists.txt      | 13 ++++++++-
 libc/src/signal/linux/killpg.cpp          | 25 +++++++++++++++++
 libc/test/src/signal/CMakeLists.txt       | 15 +++++++++-
 libc/test/src/signal/killpg_test.cpp      | 34 +++++++++++++++++++++++
 10 files changed, 122 insertions(+), 4 deletions(-)
 create mode 100644 libc/src/signal/killpg.h
 create mode 100644 libc/src/signal/linux/killpg.cpp
 create mode 100644 libc/test/src/signal/killpg_test.cpp

diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 09b1b9080e0874..c2eace9c4d1b9a 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -1383,6 +1383,7 @@ if(LLVM_LIBC_FULL_BUILD)
 
     # signal.h entrypoints
     libc.src.signal.kill
+    libc.src.signal.killpg
     libc.src.signal.pthread_kill
     libc.src.signal.pthread_sigmask
     libc.src.signal.raise
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 69189b37ddddd4..4effdc6eca3a1c 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -1569,6 +1569,7 @@ if(LLVM_LIBC_FULL_BUILD)
 
     # signal.h entrypoints
     libc.src.signal.kill
+    libc.src.signal.killpg
     libc.src.signal.pthread_kill
     libc.src.signal.pthread_sigmask
     libc.src.signal.raise
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 746e712ec160e6..e31335cf0fe230 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -1595,6 +1595,7 @@ if(LLVM_LIBC_FULL_BUILD)
 
     # signal.h entrypoints
     libc.src.signal.kill
+    libc.src.signal.killpg
     libc.src.signal.pthread_kill
     libc.src.signal.pthread_sigmask
     libc.src.signal.raise
diff --git a/libc/include/signal.yaml b/libc/include/signal.yaml
index b763da7eeb6025..1ec7c244c2dadf 100644
--- a/libc/include/signal.yaml
+++ b/libc/include/signal.yaml
@@ -57,6 +57,13 @@ functions:
     arguments:
       - type: pid_t
       - type: int
+  - name: killpg 
+    standards:
+      - posix
+    return_type: int
+    arguments:
+      - type: pid_t
+      - type: int 
   - name: raise
     standards:
       - stdc
diff --git a/libc/src/signal/CMakeLists.txt b/libc/src/signal/CMakeLists.txt
index 8da94d1eea85fd..fd375468f039ab 100644
--- a/libc/src/signal/CMakeLists.txt
+++ b/libc/src/signal/CMakeLists.txt
@@ -15,14 +15,18 @@ add_entrypoint_object(
   DEPENDS
     .${LIBC_TARGET_OS}.kill
 )
-
+add_entrypoint_object(
+  killpg
+  ALIAS
+  DEPENDS
+    .${LIBC_TARGET_OS}.killpg
+)
 add_entrypoint_object(
   sigaction
   ALIAS
   DEPENDS
     .${LIBC_TARGET_OS}.sigaction
 )
-
 add_entrypoint_object(
   sigaltstack
   ALIAS
diff --git a/libc/src/signal/killpg.h b/libc/src/signal/killpg.h
new file mode 100644
index 00000000000000..36ca6265bb3322
--- /dev/null
+++ b/libc/src/signal/killpg.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for killpg function ---------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_SIGNAL_KILLPG_H
+#define LLVM_LIBC_SRC_SIGNAL_KILLPG_H
+
+#include "hdr/types/pid_t.h"
+#include "src/__support/macros/config.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+int killpg(pid_t pgrp, int sig);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_SIGNAL_KILLPG_H
\ No newline at end of file
diff --git a/libc/src/signal/linux/CMakeLists.txt b/libc/src/signal/linux/CMakeLists.txt
index 77898cf9aab636..aafd15f897a921 100644
--- a/libc/src/signal/linux/CMakeLists.txt
+++ b/libc/src/signal/linux/CMakeLists.txt
@@ -27,7 +27,18 @@ add_entrypoint_object(
     libc.include.sys_syscall
     libc.src.__support.OSUtil.osutil
 )
-
+add_entrypoint_object(
+  killpg 
+  SRCS 
+    killpg.cpp
+  HDRS
+    ../killpg.h
+  DEPENDS 
+    libc.hdr.errno_macros
+    libc.hdr.types.pid_t
+    libc.src.errno.errno
+    libc.src.signal.kill
+)
 add_entrypoint_object(
   raise
   SRCS
diff --git a/libc/src/signal/linux/killpg.cpp b/libc/src/signal/linux/killpg.cpp
new file mode 100644
index 00000000000000..e2bcae56d26f7e
--- /dev/null
+++ b/libc/src/signal/linux/killpg.cpp
@@ -0,0 +1,25 @@
+//===-- Linux implementation of killpg ------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/signal/killpg.h"
+
+#include "hdr/errno_macros.h"
+#include "src/__support/common.h"
+#include "src/__support/libc_errno.h"
+#include "src/__support/macros/config.h"
+#include "src/signal/kill.h"
+
+namespace LIBC_NAMESPACE_DECL {
+LLVM_LIBC_FUNCTION(int, killpg, (pid_t pgrp, int sig)) {
+    if(pgrp < 0) {
+        libc_errno = EINVAL;
+        return -1;
+    }
+    return LIBC_NAMESPACE::kill(-pgrp, sig);
+ } 
+} //namespace LIBC_NAMESPACE_DECL
\ No newline at end of file
diff --git a/libc/test/src/signal/CMakeLists.txt b/libc/test/src/signal/CMakeLists.txt
index 287977e2762236..2b3cb8fd4eb9b4 100644
--- a/libc/test/src/signal/CMakeLists.txt
+++ b/libc/test/src/signal/CMakeLists.txt
@@ -24,7 +24,20 @@ add_libc_test(
     libc.src.__support.OSUtil.osutil
     libc.test.UnitTest.ErrnoSetterMatcher
 )
-
+add_libc_test(
+  killpg_test
+  SUITE 
+    libc-signal-tests
+  SRCS 
+    killpg_test.cpp
+  DEPENDS
+    libc.hdr.errno_macros
+    libc.hdr.signal_macros
+    libc.src.signal.killpg
+    libc.include.sys_syscall
+    libc.src.__support.OSUtil.osutil
+    libc.test.UnitTest.ErrnoSetterMatcher
+)
 add_libc_test(
   sigaction_test
   SUITE
diff --git a/libc/test/src/signal/killpg_test.cpp b/libc/test/src/signal/killpg_test.cpp
new file mode 100644
index 00000000000000..61535f81c45890
--- /dev/null
+++ b/libc/test/src/signal/killpg_test.cpp
@@ -0,0 +1,34 @@
+//===-- Unittests for killpg ----------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/signal/killpg.h"
+
+#include "hdr/errno_macros.h"
+#include "hdr/signal_macros.h"
+#include "src/__support/OSUtil/syscall.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
+#include "test/UnitTest/Test.h"
+
+#include <sys/syscall.h>
+
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
+using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
+
+TEST(LlvmLibcKillpgTest, InvalidPgrp) {
+  // Negative process group ID must fail with EINVAL.
+  ASSERT_THAT(LIBC_NAMESPACE::killpg(-1, 0), Fails(EINVAL));
+}
+
+TEST(LlvmLibcKillpgTest, TargetSelf) {
+  // pgrp = 0 represents the caller's process group.
+  ASSERT_THAT(LIBC_NAMESPACE::killpg(0, 0), Succeeds(0));
+
+  // Sending signal 0 to our own process group should succeed.
+  pid_t pgrp = LIBC_NAMESPACE::syscall_impl<pid_t>(SYS_getpgrp);
+  ASSERT_THAT(LIBC_NAMESPACE::killpg(pgrp, 0), Succeeds(0));
+}
\ No newline at end of file

>From f9e409329d04f8f69a36c863805c989c860ef673 Mon Sep 17 00:00:00 2001
From: anshithayeruva <anshithayeruva18 at gmail.com>
Date: Sun, 1 Nov 2026 06:22:09 +0530
Subject: [PATCH 2/3] [libc] Fix code and cmake formatting

---
 libc/src/signal/killpg.h             |  2 +-
 libc/src/signal/linux/CMakeLists.txt |  6 +++---
 libc/src/signal/linux/killpg.cpp     | 14 +++++++-------
 libc/test/src/signal/CMakeLists.txt  |  4 ++--
 4 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/libc/src/signal/killpg.h b/libc/src/signal/killpg.h
index 36ca6265bb3322..b81e3d953ee22a 100644
--- a/libc/src/signal/killpg.h
+++ b/libc/src/signal/killpg.h
@@ -18,4 +18,4 @@ int killpg(pid_t pgrp, int sig);
 
 } // namespace LIBC_NAMESPACE_DECL
 
-#endif // LLVM_LIBC_SRC_SIGNAL_KILLPG_H
\ No newline at end of file
+#endif // LLVM_LIBC_SRC_SIGNAL_KILLPG_H
diff --git a/libc/src/signal/linux/CMakeLists.txt b/libc/src/signal/linux/CMakeLists.txt
index aafd15f897a921..931ad8f8149f96 100644
--- a/libc/src/signal/linux/CMakeLists.txt
+++ b/libc/src/signal/linux/CMakeLists.txt
@@ -28,12 +28,12 @@ add_entrypoint_object(
     libc.src.__support.OSUtil.osutil
 )
 add_entrypoint_object(
-  killpg 
-  SRCS 
+  killpg
+  SRCS
     killpg.cpp
   HDRS
     ../killpg.h
-  DEPENDS 
+  DEPENDS
     libc.hdr.errno_macros
     libc.hdr.types.pid_t
     libc.src.errno.errno
diff --git a/libc/src/signal/linux/killpg.cpp b/libc/src/signal/linux/killpg.cpp
index e2bcae56d26f7e..22285d58f76b64 100644
--- a/libc/src/signal/linux/killpg.cpp
+++ b/libc/src/signal/linux/killpg.cpp
@@ -16,10 +16,10 @@
 
 namespace LIBC_NAMESPACE_DECL {
 LLVM_LIBC_FUNCTION(int, killpg, (pid_t pgrp, int sig)) {
-    if(pgrp < 0) {
-        libc_errno = EINVAL;
-        return -1;
-    }
-    return LIBC_NAMESPACE::kill(-pgrp, sig);
- } 
-} //namespace LIBC_NAMESPACE_DECL
\ No newline at end of file
+  if (pgrp < 0) {
+    libc_errno = EINVAL;
+    return -1;
+  }
+  return LIBC_NAMESPACE::kill(-pgrp, sig);
+}
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/src/signal/CMakeLists.txt b/libc/test/src/signal/CMakeLists.txt
index 2b3cb8fd4eb9b4..87bf3088730976 100644
--- a/libc/test/src/signal/CMakeLists.txt
+++ b/libc/test/src/signal/CMakeLists.txt
@@ -26,9 +26,9 @@ add_libc_test(
 )
 add_libc_test(
   killpg_test
-  SUITE 
+  SUITE
     libc-signal-tests
-  SRCS 
+  SRCS
     killpg_test.cpp
   DEPENDS
     libc.hdr.errno_macros

>From 6cfee3a8c92f35f329b63e40ae16e3d3365ad6ac Mon Sep 17 00:00:00 2001
From: anshithayeruva <anshithayeruva18 at gmail.com>
Date: Sun, 1 Nov 2026 22:23:22 +0530
Subject: [PATCH 3/3] [libc] Address review feedback for killpg

---
 libc/include/signal.yaml             |  4 ++--
 libc/src/signal/CMakeLists.txt       |  3 +++
 libc/src/signal/killpg.h             |  7 ++++++-
 libc/src/signal/linux/CMakeLists.txt |  9 +++++++--
 libc/src/signal/linux/killpg.cpp     | 22 +++++++++++++++++++---
 libc/test/src/signal/CMakeLists.txt  |  6 +++---
 libc/test/src/signal/killpg_test.cpp | 20 ++++++++++++--------
 7 files changed, 52 insertions(+), 19 deletions(-)

diff --git a/libc/include/signal.yaml b/libc/include/signal.yaml
index 1ec7c244c2dadf..31ac3b1bd4dfb0 100644
--- a/libc/include/signal.yaml
+++ b/libc/include/signal.yaml
@@ -57,13 +57,13 @@ functions:
     arguments:
       - type: pid_t
       - type: int
-  - name: killpg 
+  - name: killpg
     standards:
       - posix
     return_type: int
     arguments:
       - type: pid_t
-      - type: int 
+      - type: int
   - name: raise
     standards:
       - stdc
diff --git a/libc/src/signal/CMakeLists.txt b/libc/src/signal/CMakeLists.txt
index fd375468f039ab..fec7abb26ad572 100644
--- a/libc/src/signal/CMakeLists.txt
+++ b/libc/src/signal/CMakeLists.txt
@@ -15,18 +15,21 @@ add_entrypoint_object(
   DEPENDS
     .${LIBC_TARGET_OS}.kill
 )
+
 add_entrypoint_object(
   killpg
   ALIAS
   DEPENDS
     .${LIBC_TARGET_OS}.killpg
 )
+
 add_entrypoint_object(
   sigaction
   ALIAS
   DEPENDS
     .${LIBC_TARGET_OS}.sigaction
 )
+
 add_entrypoint_object(
   sigaltstack
   ALIAS
diff --git a/libc/src/signal/killpg.h b/libc/src/signal/killpg.h
index b81e3d953ee22a..be02db758a3ce8 100644
--- a/libc/src/signal/killpg.h
+++ b/libc/src/signal/killpg.h
@@ -1,10 +1,15 @@
-//===-- Implementation header for killpg function ---------------*- C++ -*-===//
+//===----------------------------------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //===----------------------------------------------------------------------===//
+///
+/// \file
+/// Implementation header for killpg function.
+///
+//===----------------------------------------------------------------------===//
 
 #ifndef LLVM_LIBC_SRC_SIGNAL_KILLPG_H
 #define LLVM_LIBC_SRC_SIGNAL_KILLPG_H
diff --git a/libc/src/signal/linux/CMakeLists.txt b/libc/src/signal/linux/CMakeLists.txt
index 931ad8f8149f96..fc7cb8660538ee 100644
--- a/libc/src/signal/linux/CMakeLists.txt
+++ b/libc/src/signal/linux/CMakeLists.txt
@@ -27,6 +27,7 @@ add_entrypoint_object(
     libc.include.sys_syscall
     libc.src.__support.OSUtil.osutil
 )
+
 add_entrypoint_object(
   killpg
   SRCS
@@ -36,9 +37,13 @@ add_entrypoint_object(
   DEPENDS
     libc.hdr.errno_macros
     libc.hdr.types.pid_t
-    libc.src.errno.errno
-    libc.src.signal.kill
+    libc.include.sys_syscall
+    libc.src.__support.OSUtil.osutil
+    libc.src.__support.common
+    libc.src.__support.libc_errno
+    libc.src.__support.macros.config
 )
+
 add_entrypoint_object(
   raise
   SRCS
diff --git a/libc/src/signal/linux/killpg.cpp b/libc/src/signal/linux/killpg.cpp
index 22285d58f76b64..9d3e154b667850 100644
--- a/libc/src/signal/linux/killpg.cpp
+++ b/libc/src/signal/linux/killpg.cpp
@@ -1,25 +1,41 @@
-//===-- Linux implementation of killpg ------------------------------------===//
+//===----------------------------------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //===----------------------------------------------------------------------===//
+///
+/// \file
+/// Linux implementation of killpg.
+///
+//===----------------------------------------------------------------------===//
 
 #include "src/signal/killpg.h"
 
 #include "hdr/errno_macros.h"
+#include "src/__support/OSUtil/syscall.h"
 #include "src/__support/common.h"
 #include "src/__support/libc_errno.h"
 #include "src/__support/macros/config.h"
-#include "src/signal/kill.h"
+
+#include <sys/syscall.h>
 
 namespace LIBC_NAMESPACE_DECL {
+
 LLVM_LIBC_FUNCTION(int, killpg, (pid_t pgrp, int sig)) {
   if (pgrp < 0) {
     libc_errno = EINVAL;
     return -1;
   }
-  return LIBC_NAMESPACE::kill(-pgrp, sig);
+
+  int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_kill, -pgrp, sig);
+  if (ret != 0) {
+    libc_errno = (ret > 0 ? ret : -ret);
+    return -1;
+  }
+
+  return 0;
 }
+
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/test/src/signal/CMakeLists.txt b/libc/test/src/signal/CMakeLists.txt
index 87bf3088730976..dff6b6be6874ff 100644
--- a/libc/test/src/signal/CMakeLists.txt
+++ b/libc/test/src/signal/CMakeLists.txt
@@ -24,6 +24,7 @@ add_libc_test(
     libc.src.__support.OSUtil.osutil
     libc.test.UnitTest.ErrnoSetterMatcher
 )
+
 add_libc_test(
   killpg_test
   SUITE
@@ -32,12 +33,11 @@ add_libc_test(
     killpg_test.cpp
   DEPENDS
     libc.hdr.errno_macros
-    libc.hdr.signal_macros
     libc.src.signal.killpg
-    libc.include.sys_syscall
-    libc.src.__support.OSUtil.osutil
+    libc.src.unistd.getpgrp
     libc.test.UnitTest.ErrnoSetterMatcher
 )
+
 add_libc_test(
   sigaction_test
   SUITE
diff --git a/libc/test/src/signal/killpg_test.cpp b/libc/test/src/signal/killpg_test.cpp
index 61535f81c45890..cd2cff7b0c88e5 100644
--- a/libc/test/src/signal/killpg_test.cpp
+++ b/libc/test/src/signal/killpg_test.cpp
@@ -1,21 +1,23 @@
-//===-- Unittests for killpg ----------------------------------------------===//
+//===----------------------------------------------------------------------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //===----------------------------------------------------------------------===//
+///
+/// \file
+/// Unittests for killpg.
+///
+//===----------------------------------------------------------------------===//
 
 #include "src/signal/killpg.h"
 
 #include "hdr/errno_macros.h"
-#include "hdr/signal_macros.h"
-#include "src/__support/OSUtil/syscall.h"
+#include "src/unistd/getpgrp.h"
 #include "test/UnitTest/ErrnoSetterMatcher.h"
 #include "test/UnitTest/Test.h"
 
-#include <sys/syscall.h>
-
 using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
 using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
 
@@ -24,11 +26,13 @@ TEST(LlvmLibcKillpgTest, InvalidPgrp) {
   ASSERT_THAT(LIBC_NAMESPACE::killpg(-1, 0), Fails(EINVAL));
 }
 
-TEST(LlvmLibcKillpgTest, TargetSelf) {
+TEST(LlvmLibcKillpgTest, ZeroPgrpTargetsCallerGroup) {
   // pgrp = 0 represents the caller's process group.
   ASSERT_THAT(LIBC_NAMESPACE::killpg(0, 0), Succeeds(0));
+}
 
+TEST(LlvmLibcKillpgTest, ExplicitPgrp) {
   // Sending signal 0 to our own process group should succeed.
-  pid_t pgrp = LIBC_NAMESPACE::syscall_impl<pid_t>(SYS_getpgrp);
+  pid_t pgrp = LIBC_NAMESPACE::getpgrp();
   ASSERT_THAT(LIBC_NAMESPACE::killpg(pgrp, 0), Succeeds(0));
-}
\ No newline at end of file
+}



More information about the libc-commits mailing list