如何导出c++;来自shell的方法符号和exec?; 我理解使用外部“C”,我可以调用C程序中的C++方法,因为不同的名称策略。 现在我想从shell调用C++方法,但我不知道如何?< /P>
例如,我有如下代码:如何导出c++;来自shell的方法符号和exec?; 我理解使用外部“C”,我可以调用C程序中的C++方法,因为不同的名称策略。 现在我想从shell调用C++方法,但我不知道如何?< /P>,c++,C++,例如,我有如下代码: extern“C”void Print_Statistic(){ //将一些数据输出到控制台 } int main(){ //有些东西起作用了 返回0; } 当程序运行时,我想连接到它的进程,并从shell命令行调用Print\u Statistic(),以便在控制台上打印一些数据。 我真的不知道怎么做。假设是一个POSIXy shell,您需要从信号处理程序调用void Print\u Statistic()。然后,设置提醒标志以打印这些统计信息。在信号处理器内部,无法
extern“C”void Print_Statistic(){
//将一些数据输出到控制台
}
int main(){
//有些东西起作用了
返回0;
}
当程序运行时,我想连接到它的进程,并从shell命令行调用Print\u Statistic()
,以便在控制台上打印一些数据。
我真的不知道怎么做。假设是一个POSIXy shell,您需要从
信号处理程序调用void Print\u Statistic()
。然后,设置提醒标志以打印这些统计信息。在信号处理器内部,无法打印。信号不知道targte程序是否同时打印任何内容
如何从其他代码中检查提醒标志取决于您;这是一个更高层次的设计问题。当您希望从命令行触发print\u statistics()
时,您需要一个执行触发的附加程序。该触发器必须以进程间方式运行;您的附加程序是一个进程,而您的原始程序是另一个进程。除了 > STD::文件系统< /代码>,标准C++没有提供进程间通信,而对您来说,<>代码> STD::文件系统< /代码>不适合您的目的。因此,您需要一个依赖于操作系统的解决方案,最好是一个针对不同操作系统的操作非常相似的解决方案。下面我包含了一些适用于linux和Windows的代码
您的原始程序:
#include <sstream>
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
#ifdef __linux__
#include <semaphore.h>
#include <fcntl.h>
using event_t = sem_t*;
event_t create_event()
{
event_t event = sem_open("/print_statistics", O_CREAT, 0644, 0);
if (event == SEM_FAILED)
{
int error = errno;
std::stringstream ss;
ss << "sem_open failed with error code " << error << ".";
throw std::runtime_error(ss.str());
}
return event;
}
bool wait_for(event_t& event)
{
if (sem_wait(event))
{
int error = errno;
std::stringstream ss;
ss << "sem_wait failed with error code " << error << ".";
throw std::runtime_error(ss.str());
}
return true;
}
void close_event(event_t& event) noexcept
{
sem_close(event);
}
#elif _WIN32
#include <Windows.h>
using event_t = HANDLE;
event_t create_event()
{
event_t event = CreateEventA(nullptr, FALSE, FALSE, "Local\\print_statistics");
if (!event)
{
DWORD error = GetLastError();
std::stringstream ss;
ss << "CreateEventA failed with error code " << error << ".";
throw std::runtime_error(ss.str());
}
return event;
}
bool wait_for(event_t& event)
{
if( WaitForSingleObject( event, INFINITE) != WAIT_OBJECT_0)
{
DWORD error = GetLastError();
std::stringstream ss;
ss << "WaitForSingleObject failed with error code " << error << ".";
throw std::runtime_error(ss.str());
}
return true;
}
void close_event(event_t& event) noexcept
{
CloseHandle(event);
}
#else
# error "Unsupported OS"
#endif
void print_statistics()
{
std::cout << "some data" << std::endl;
}
int main()
{
try
{
auto close_on_exit = [](event_t* p) { close_event(*p); };
event_t event = create_event();
std::unique_ptr<event_t, decltype(close_on_exit)> raii_event(&event, close_on_exit);
std::atomic_bool do_continue = true;
std::future<void> print_statistic_future = std::async(std::launch::async, [&do_continue, &event]()
{
auto make_false_on_exit = [](std::atomic_bool* p) { *p = false; };
std::unique_ptr<std::atomic_bool, decltype(make_false_on_exit)> raii_do_continue(&do_continue, make_false_on_exit);
while (wait_for(event))
{
print_statistics();
}
});
while (do_continue)
{
// something works
using namespace std::chrono_literals;
std::this_thread::sleep_for(1s);
}
print_statistic_future.get();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
}
#包括
#包括
#包括
#包括
#包括
#ifdef\uuuu linux\uuuu
#包括
#包括
使用event_t=sem_t*;
事件\u t创建\u事件()
{
event\u t event=sem\u open(“/print\u statistics”,O\u CREAT,0644,0);
如果(事件==SEM_失败)
{
int error=errno;
std::stringstream-ss;
ss Shell不是这样工作的,它们只能执行程序(调用main
函数)。@Someprogrammerdude:Shell可以向正在运行的程序发送信号。KILL信号很常见,但HUP通常用于告诉正在运行的程序需要重新加载配置。我看到两个选项:1.从标准输入读取命令(即,std::cin
)。然后,您的shell可以将命令导入其中。2.提供您的程序命令行参数以启用/禁用其执行的选项。(@MSalters),但它仍然与“调用”任意函数不同。
#include <sstream>
#include <iostream>
#ifdef __linux__
#include <semaphore.h>
void trigger_event()
{
sem_t* event = sem_open("/print_statistics", 0);
if (event == SEM_FAILED)
{
int error = errno;
std::stringstream ss;
ss << "sem_open failed with error code " << error << ".";
throw std::runtime_error(ss.str());
}
if (sem_post(event))
{
int error = errno;
sem_close(event);
std::stringstream ss;
ss << "sem_post failed with error code " << error << ".";
throw std::runtime_error(ss.str());
}
sem_close(event);
}
#elif _WIN32
#include <Windows.h>
void trigger_event()
{
HANDLE event = OpenEventA(EVENT_MODIFY_STATE, FALSE, "Local\\print_statistics");
if (!event)
{
DWORD error = GetLastError();
std::stringstream ss;
ss << "OpenEventA failed with error code " << error << ".";
throw std::runtime_error(ss.str());
}
if (!SetEvent(event))
{
DWORD error = GetLastError();
CloseHandle(event);
std::stringstream ss;
ss << "SetEvent failed with error code " << error << ".";
throw std::runtime_error(ss.str());
}
CloseHandle(event);
}
#else
# error "Unsupported OS"
#endif
int main()
{
try
{
trigger_event();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
}