如何导出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;
    }
}