v2: BOOST_PROCESS_V2_DISABLE_SIGNALSET does not compile with the signal-based process handle
Évaluation
- Difficulté
- 3/5
- Temps estimé
- Une demi-journée
- Accessibilité débutants
- 62/100
Piste de recherche
The compile error is in the #else branch of async_wait() in include/boost/process/v2/detail/process_handle_signal.hpp, around line 350. Compare it with async_wait in process_handle_fd_or_signal.hpp, which completes with operation_not_supported. Build the reproducer with BOOST_PROCESS_V2_DISABLE_SIGNALSET and BOOST_PROCESS_V2_DISABLE_PIDFD_OPEN on Linux, then add test/v2/disable_signalset.cpp. Done means it compiles, the new test passes under b2, and the CMake target builds if develop's removed test_impl target is fixed.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
With BOOST_PROCESS_V2_DISABLE_SIGNALSET defined, any use of process fails to compile where basic_process_handle_signal is used: macOS, the BSDs without pdfork, and Linux with BOOST_PROCESS_V2_DISABLE_PIDFD_OPEN. Affects 1.89 to 1.92 and develop.
#define BOOST_PROCESS_V2_DISABLE_SIGNALSET
#include <boost/asio/io_context.hpp>
#include <boost/process/v2/process.hpp>
int main()
{
boost::asio::io_context ctx;
boost::process::v2::process proc(ctx, "/bin/sh", {"-c", "exit 3"});
return proc.wait();
}
On Linux, add -DBOOST_PROCESS_V2_DISABLE_PIDFD_OPEN to get the signal handle.
GCC 15: process_handle_signal.hpp:373:68: error: too many initializers for '...::async_wait_op_'
clang 17: process_handle_signal.hpp:374:55: error: excess elements in struct initializer
31d6b5c9f82b0b1fd0fbd25f7f1af58d51d6e49f changed async_wait() to initialize async_wait_op_{signal_set_, pid_, exit_code} and the operation to complete with (Self&&, error_code), but the #else branch for the disabled signal set still has two members and dispatches the old (exit_code, ec) completion. Since the initializer is in the trailing return type of async_wait(), the error appears as soon as the class is instantiated.
Fix, matching process_handle_fd_or_signal.hpp (async_wait completes with operation_not_supported):
--- a/include/boost/process/v2/detail/process_handle_signal.hpp
+++ b/include/boost/process/v2/detail/process_handle_signal.hpp
@@ -348,15 +348,17 @@ struct basic_process_handle_signal
net::dispatch(exec, net::append(std::move(self), ec));
}
#else
- signal_set_dummy_ dummy_;
- pid_t pid;
+ signal_set_dummy_ &handle;
+ pid_type pid_;
+ native_exit_code_type & exit_code;
+
template<typename Self>
void operator()(Self &&self)
{
- auto exec = net::get_associated_immediate_executor(self, dummy_.get_executor());
+ auto exec = net::get_associated_immediate_executor(self, handle.get_executor());
error_code ec;
BOOST_PROCESS_V2_ASSIGN_EC(ec, net::error::operation_not_supported);
- net::dispatch(exec, net::append(std::move(self), native_exit_code_type(), ec));
+ net::dispatch(exec, net::append(std::move(self), ec));
}
#endif
A test, also run on Linux with BOOST_PROCESS_V2_DISABLE_PIDFD_OPEN so CI covers the signal handle. Passes with b2 on Linux (GCC 15) and macOS (Apple clang 17); without the fix it fails to compile. I can open a PR with both.
Test
--- a/test/v2/Jamfile.jam
+++ b/test/v2/Jamfile.jam
@@ -58,5 +58,8 @@ test-suite with_target :
[ run process.cpp $(test_impl) : --log_level=all --catch_system_errors=no -- : target ]
[ run windows.cpp $(test_impl) : --log_level=all --catch_system_errors=no -- : target : <build>no <target-os>windows:<build>yes <target-os>windows:<source>Advapi32 ]
[ run ext.cpp $(test_impl) : --log_level=all --catch_system_errors=no -- : target : <target-os>darwin:<build>no ]
+ [ run disable_signalset.cpp $(test_impl) : --log_level=all --catch_system_errors=no -- : target ]
+ [ run disable_signalset.cpp $(test_impl) : --log_level=all --catch_system_errors=no -- : target
+ : <build>no <target-os>linux:<build>yes <define>BOOST_PROCESS_V2_DISABLE_PIDFD_OPEN=1 : disable_signalset_no_pidfd ]
;
--- a/test/v2/CMakeLists.txt
+++ b/test/v2/CMakeLists.txt
@@ -34,3 +34,14 @@ endfunction()
boost_process_v2_test_with_target(process)
boost_process_v2_test_with_target(ext)
+boost_process_v2_test_with_target(disable_signalset)
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ # The signal-based process handle that macOS and the BSDs use.
+ add_executable(boost_process_v2_disable_signalset_no_pidfd disable_signalset.cpp)
+ target_link_libraries(boost_process_v2_disable_signalset_no_pidfd PUBLIC Boost::process Boost::system Boost::filesystem boost_process_v2_test_impl)
+ target_compile_definitions(boost_process_v2_disable_signalset_no_pidfd PRIVATE BOOST_PROCESS_V2_DISABLE_PIDFD_OPEN=1)
+ add_dependencies(boost_process_v2_disable_signalset_no_pidfd boost_process_v2_test_target)
+ add_test(NAME boost_process_v2_disable_signalset_no_pidfd COMMAND $<TARGET_FILE:boost_process_v2_disable_signalset_no_pidfd>
+ -- $<TARGET_FILE:boost_process_v2_test_target>)
+endif()
--- /dev/null
+++ b/test/v2/disable_signalset.cpp
@@ -0,0 +1,69 @@
+// Copyright (c) 2026 Stefan Dinkelacker
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// An application that handles SIGCHLD itself must keep asio from installing
+// a handler for it.
+#define BOOST_PROCESS_V2_DISABLE_SIGNALSET 1
+
+#include <boost/process/v2/process.hpp>
+
+#include <boost/asio/io_context.hpp>
+#include <boost/test/unit_test.hpp>
+
+namespace bpv = boost::process::v2;
+namespace asio = boost::asio;
+
+BOOST_AUTO_TEST_SUITE(disable_signalset);
+
+BOOST_AUTO_TEST_CASE(wait)
+{
+ using boost::unit_test::framework::master_test_suite;
+ const auto pth = master_test_suite().argv[1];
+
+ asio::io_context ctx;
+ BOOST_CHECK_EQUAL(bpv::process(ctx, pth, {"exit-code", "42"}).wait(), 42);
+}
+
+BOOST_AUTO_TEST_CASE(async_wait)
+{
+ using boost::unit_test::framework::master_test_suite;
+ const auto pth = master_test_suite().argv[1];
+
+ asio::io_context ctx;
+ bpv::process proc(ctx, pth, {"exit-code", "42"});
+
+ bool called = false;
+ boost::system::error_code ec;
+ int code = -1;
+
+ proc.async_wait(
+ [&](boost::system::error_code ec_, int code_)
+ {
+ called = true;
+ ec = ec_;
+ code = code_;
+ });
+
+ ctx.run();
+ BOOST_CHECK(called);
+
+#if defined(BOOST_PROCESS_V2_WINDOWS) || defined(BOOST_PROCESS_V2_PIDFD_OPEN) \
+ || defined(BOOST_PROCESS_V2_PDFORK) || defined(BOOST_PROCESS_V2_PIPEFORK)
+ // These handles wait on a handle or descriptor, which needs no signal set.
+ BOOST_CHECK_MESSAGE(!ec, ec.message());
+ BOOST_CHECK_EQUAL(code, 42);
+#else
+ // The signal-based handle has nothing to wait on, but wait() still works.
+ BOOST_CHECK_EQUAL(ec, asio::error::operation_not_supported);
+ BOOST_CHECK_EQUAL(proc.wait(), 42);
+#endif
+}
+
+BOOST_AUTO_TEST_SUITE_END();
The CMake part follows boost_process_v2_test_with_target, which links boost_process_v2_test_impl, a target removed in 01c9a5b60f3e25f49e619df34178498e79f463e4. So on develop the CMake test build fails for all tests with a target, this one included; b2 is fine.
- Langage dominant
- C++
- Étoiles
- 145
- Forks
- 151
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de boostorg/process
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 72/100
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 68/100
-
Why does it synchronously wait?Ouverte
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
Toutes les issues de boostorg/process
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
FriendsofECCE/ECCE#336 · 1 commentaire ·
-
Real literal with a 'd' exponent and a kind suffix (1.0d0_4) is accepted; the suffix is ignoredOuverteerror not reported low priority semantics
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
bitcoin-core/gui-qml#1030 ·
Les mainteneurs répondent en général sous 3 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 80/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour