我想在perl中编写一个强大的守护进程,它将在Linux上运行并遵循这个优秀答案中描述的模板.但是我的情况有一些不同:首先我使用的是Parallel :: ForkManager start() and next ; 紧接着在事件上分叉exec('handle_event.pl')
在这种情况下,我有以下问题:
exec('handle_event.pl')将处理程序在exec中继承(我知道它们是继承的fork)?handle_event.pl这个定义会覆盖父类中定义的那个吗?谢谢
我查看了文档等,但我没有看到任何明显的东西.我想有可以拦截一个信号处理程序^C,^\或可能被用于中断长时间运行的脚本某些其他按键(每一个离散的计算典型地<1秒),并允许其正常退出并保存当前的状态.
Matlab确实有COM的事件处理程序,但它只是windows,我在*nix环境中.
如果答案是'艰难的运气',那我很酷......我只是没有看到任何说我已经SOL的东西了.
我有一个启动多个线程的应用程序.我正在使用信号处理程序捕获信号.
我不希望我的申请退出SIGSEGV; 我想只终止产生信号的线程,并继续在其他线程中完整应用程序的流程.可能吗?
我有以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_t test_thread;
void *thread_test_run (void *v)
{
int i=1;
while(1)
{
printf("into thread %d\r\n",i);
i++;
sleep(1);
}
return NULL
}
int main()
{
pthread_create(&test_thread, NULL, &thread_test_run, NULL);
sleep (20);
pthread_cancel(test_thread);
sleep(100);
// In this period (before the finish of myprogram),
// I execute killall to kill myprogram
// I want to add a signal handle function to
// execute pthread_exit() before the program quit
}
Run Code Online (Sandbox Code Playgroud)
我想通过添加一个信号处理函数来在程序退出之前执行 pthread_exit() 来完成我的代码。
怎么做 ?
我正在寻找一种方法来停止每 2 秒执行一次任务的线程。我决定尝试使用 std::promise/future 以便在设置承诺时线程可以立即退出。
#include <future>
#include <iostream>
#include <chrono>
#include <csignal>
std::promise<void> stop;
int main() {
std::signal(SIGINT, [] (int) { stop.set_value(); } );
auto future = stop.get_future();
while (future.wait_for(std::chrono::seconds(1)) != std::future_status::ready) {
std::cout << "I'm still there" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
实际上这不起作用并以这种方式崩溃:
$ ./a.out 我还在那里 ^Cterminate 在抛出一个 'std::system_error'
what()实例后被调用:未知错误 -1 放弃(核心转储)
好的,一个人应该注意他在处理程序上下文中所做的事情,但我必须说我没有预料到这次崩溃;我真的不明白……你有什么想法吗?
在C++中,我有一些需要写入临时目录的函数.理想情况下,只创建一个他们都写入的临时目录(以最小化I/O开销).程序退出时,应自动删除该目录.
但是,我不想在main函数中处理temp目录的创建和删除,因为我认为只有实际使用该目录的函数才应该负责它的创建和删除.并且主函数不一定知道根本使用临时目录.
这是我尝试过的(参见下面的代码):可以从任何地方全局调用的getTempDir()函数仅在其第一次调用时创建目录,并在每次调用时返回目录名称.在第一次调用时,它还会为一个小的DirRemover对象创建一个静态boost :: shared_ptr,该对象的析构函数将删除该目录.程序退出时会自动调用析构函数.
问题是它不会在程序退出失败时调用FileRemover析构函数,或者杀死等等.是否有更好的解决方案?
这是代码:
std::string getTempDir(){
static bool alreadyThere = false;
static std::string name = "";
if(!alreadyThere){
// create dir with
// popen("mktemp -p /tmp","r"))
// and store its name in 'name'
removeAtEnd(name);
alreadyThere = true;
}
return name;
}
void removeAtEnd(const std::string& name){
static boost::shared_ptr<DirRemover> remover(new DirRemover(name));
}
struct DirRemover {
std::string name;
DirRemover(const std::string& n) : name(n){}
~DirRemover(){
// remove 'name' dir with popen("rm -r ...")
}
};
Run Code Online (Sandbox Code Playgroud) 我的要求是:我的工具中有一个信号处理程序,它在某个特定的间隔(我正在使用计时器)之间注册和使用.
现在,此信号处理程序不应允许在此处理程序注册后注册任何其他处理程序.(但是这个限制仅持续很短的时间,意味着在该持续时间之后用户可以自由地调用他自己的处理程序)
有没有办法实现这个目标?
sigset_t mask;
struct sigaction sa;
printf("Establishing handler for signal %d\n", SIG);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = handler; // This handler should override all handlers
sigaction(SIG, &sa, NULL);
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGUSR1;
Run Code Online (Sandbox Code Playgroud)
注意:我的工具实际上是用C++编写的,但是概念非常接近,因为越来越多的人熟悉它,我也使用C++标记C++ 请随时要求更多说明(如果需要)
在用我用于self.ui.tableWidget.resizeRowToContents每一行的一些文本填充 tableWidget 时。之后 and: self.ui.tableWidget.setSortingEnabled(1),sorting 按预期工作,但行不再根据内容调整大小,实际上它们保留了以前的高度。
name name v name v
--------- --------- ---------
text2 text1line1 text1line1
--------- after sort is clicked: --------- expected: text1line2
text1line1 text1line3
text1line2 text2 ---------
text1line3 text2
--------- --------- ---------
Run Code Online (Sandbox Code Playgroud)
我的想法是在单击标题中的排序时捕获信号,然后再次self.ui.tableWidget.resizeRowToContents 遍历所有行。
如何捕捉该信号?
我有2个程序(由我编写).第一个名为"MAN"的人将调用"D"(第二个),这个过程将在后台运行,直到以某种方式终止.
我想终止MAN而不终止D.
我尝试使用ctrl + c终止MAN并正确终止man(我拦截了sigint信号),现在我希望D继续运行,但是当MAN收到CTRL + C时,D也接收它.
如何处理这种情况?重要的是,我希望保持仅运行D并以CTRL + C结束的可能性.当我通过MAN运行时出现问题,我不想用CTRL + C终止它,它应该只到达MAN.
有什么建议吗?
我有一个信号处理片段,但它在我的Mac和虚拟Linux盒子上出现故障在koding.com但在我的办公室Linux PC上它正在工作..有人请告诉我为什么..
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void my_isr(int n){
printf("Hello World");
signal(SIGINT, SIG_DFL);
}
int main(){
signal(SIGINT, my_isr);
printf("pid = %d\n", getpid());
while(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我按下Ctrl + C时,它不是Hello World第一次打印,但它正在重新修改SIGINT信号动作,因此当我第二次按Ctrl + C时它退出程序.有人能解释一下为什么吗?
我想暂停线程并恢复它。有上市一些方法在这里。但是我想到了pause()从使用库函数unistd.h。
在信号处理程序中使用暂停有哪些陷阱?
我注意到的一个是,当我发送0到暂停线程并0再次发送时,我的信号已排队。我需要发送1两次以恢复线程。
我猜可能还会有更多类似的情况。如果要使用信号处理程序pause()或sleep()在信号处理程序中如何处理此类情况。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
static bool thread_ready = false;
static void cb_sig(int signal)
{
if (signal == SIGUSR1)
pause();
else if (signal == SIGUSR2)
;
}
static void *thread_job(void *ignore)
{
int i = 0;
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = cb_sig;
if (sigaction(SIGUSR1, &act, NULL) == -1)
printf("unable to handle …Run Code Online (Sandbox Code Playgroud) 假设我有以下程序:
#include <signal.h>
#include <stddef.h>
#include <stdlib.h>
static void myHandler(int sig){
abort();
}
int main(void){
signal(SIGSEGV,myHandler);
char* ptr=NULL;
*ptr='a';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我注册了一个信号处理程序和一些行,我取消引用了一个空指针 ==> 触发了 SIGSEGV。但它是如何触发的?如果我使用strace(输出剥离)运行它:
//Set signal handler (In glibc signal simply wraps a call to sigaction)
rt_sigaction(SIGSEGV, {sa_handler=0x563b125e1060, sa_mask=[SEGV], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7ffbe4fe0d30}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
//SIGSEGV is raised
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [SEGV], 8) = 0
Run Code Online (Sandbox Code Playgroud)
但是缺少一些东西,信号如何从 CPU 传递到程序?我的理解:
[Dereferences null pointer] -> …Run Code Online (Sandbox Code Playgroud)