[libc-commits] [libc] [libc] Implement killpg (Part of #236167) (PR #237561)
via libc-commits
libc-commits at lists.llvm.org
Sat Oct 31 06:07:30 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libc
Author: Anshitha Yeruva (anshithayeruva)
<details>
<summary>Changes</summary>
This patch implements the POSIX `killpg` signal function in LLVM libc, along with unit tests.
Part of #<!-- -->236167.
---
Full diff: https://github.com/llvm/llvm-project/pull/237561.diff
10 Files Affected:
- (modified) libc/config/linux/aarch64/entrypoints.txt (+1)
- (modified) libc/config/linux/riscv/entrypoints.txt (+1)
- (modified) libc/config/linux/x86_64/entrypoints.txt (+1)
- (modified) libc/include/signal.yaml (+7)
- (modified) libc/src/signal/CMakeLists.txt (+6-2)
- (added) libc/src/signal/killpg.h (+21)
- (modified) libc/src/signal/linux/CMakeLists.txt (+12-1)
- (added) libc/src/signal/linux/killpg.cpp (+25)
- (modified) libc/test/src/signal/CMakeLists.txt (+14-1)
- (added) libc/test/src/signal/killpg_test.cpp (+34)
``````````diff
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
``````````
</details>
https://github.com/llvm/llvm-project/pull/237561
More information about the libc-commits
mailing list