草庐IT

信号灯

全部标签

c - 信号不会在 execv() 中正确重新启用

我正在为我正在开发的Linux发行版编写系统关键程序。它需要在接收到某些信号时自行重启,以避免崩溃。问题是,重启后,我无法重新启用该信号。也就是说,信号不能被接收到两次。在execv()自身之后,当新进程调用signal()来设置信号时,将返回SIG_DFL。每次。即使我连续两次调用它-表明它从未在一开始就设置过。是否从原始过程中继承了一些奇怪的标志? 最佳答案 您实际上是在尝试递归处理信号,这与您犯规了。使用signal()时要注册一个信号处理程序,该信号编号将被阻塞,直到信号处理程序返回-实际上内核/libc在调用信号处理程序时

c - 什么是通用信号量范围?

一般信号量的范围是多少。我知道它可以取负值,0和1。负值表示阻塞队列中阻塞的进程数。0表示没有进程处于阻塞状态,1表示有一个资源可用,但没有进程抢占它我想知道它的值是否可能大于1。(例如2)这是什么意思?这是否意味着我们有多个资源用于单个信号量? 最佳答案 您应该准确指定您所谈论的信号量类型。Linux支持内核信号量、POSIX信号量和SystemV信号量。SystemV信号量API说明信号量值不能小于0。POSIX信号量API记录“如果sem被锁定,则sval指向的对象应设置为零或负数,其绝对值表示在某个未指定时间等待信号量的进程

c - linux信号处理程序中的malloc导致死锁

首先很抱歉在信号处理程序中调用malloc:)。我也明白我们不应该在信号处理程序中执行任何耗时的任务/这种讨厌的东西。但我很想知道它崩溃的原因?#00x00006e3ff2b60dcein_lll_lock_wait_private()from/lib64/libc.so.6#10x00006e3ff2aec138in_L_lock_9164()from/lib64/libc.so.6#20x00006e3ff2ae9a32inmalloc()from/lib64/libc.so.6#30x00006e3ff1f691adin??()from..我在https://access.red

php - 管道关闭后向进程发送哪个信号

我运行一个foreignprogram并将输出通过管道传输到outputcatcher。命令是这样执行的:$foreignprogram|输出捕捉器我想在outputcatcher中处理foreignprogram的退出。当foreignprogram退出时,outputcatcher也会退出。outputcatcher是否收到任何信号以便我处理它?我尝试了SIGINT、SIGTERM和SIGHUP,但到目前为止没有成功。如果重要的话,ouputcatcher是用PHP编写的,我用pcntl_signal()处理信号 最佳答案 我认

c - 停止子进程中的信号传播,使 exec

我目前正在制作一个shell,当我启动一个需要在后台工作的进程时,以及当我在启动后按CTRL-C时,我遇到了麻烦。基本上一切正常,但如果我在forked-execvp进程运行时按CTRL-C,即使我已经处理了信号,CTRL-C也会传播给我的child。我理解传播的原因(如果我理解正确,信号发送给所有与终端相关的child)问题正如我在上一个与我的问题相关的主题中看到的那样,我们无法在紧接着执行exec时处理信号。所以我向社区询问是否有办法在我的child中处理这个ctrl-c(基本上什么都不做),因为我需要在杀死每个后台进程之前在我的父亲进程中请求确认。希望清楚,如果有任何误解,请不要

c++ - 如何中断epoll_pwait来捕捉信号

我会编写一个小测试,通过捕获任何中断信号来显示epoll_Wait和epoll_pwait()之间的区别。任何人都可以通过小代码或任何方法找到它吗?intepoll_pwait(intepfd,structepoll_event*events,intmaxevents,inttimeout,constsigset_t*sigmask); 最佳答案 如果您正在寻找一种将信号处理集成到epoll事件循环中的方法,请查看signalfd(2)manpage.它将为您提供一个fd,您可以将其添加到轮询集中,以便在您的进程(或线程,如果与您的

c - 如何删除未使用的共享内存和信号量?

类似于:DeleteallsharedmemoryandsemaphoresonLinux但是,我想在C中这样做,而不是使用某些脚本。我的具体问题:在linux+mac中,当我调试一个程序并在进程中终止它时,共享资源(内存+信号量)没有被释放。我的程序做了一些客户端服务器的事情,其中​​服务器是获取共享资源的第一个进程。因此,在没有分离的情况下终止后,当我重新启动程序时,它假定它是没有服务器时的客户端(因为资源已创建且未释放)。目前,我正在使用Qt来管理共享资源,但Qt似乎没有办法处理这种情况(创建返回的错误代码是资源已经创建)。因此,我正在寻找一种更特定于操作系统的方法来做到这一点。

c++ - 在线程之间发送信号

我刚接触多线程。我对在线程之间传递信号有一个疑问。我在一个线程中提升信号(比如线程1)。我在线程2中有一个函数(比如f1),在其中注册信号。当线程1中出现信号时,是否可以退出属于线程2的函数f1。如果可能,请告诉我如何实现它。我的操作系统是Linux,我使用的是ace线程。 最佳答案 在C++11中,可以使用条件变量,如这里所解释的http://en.cppreference.com/w/cpp/thread/condition_variable 关于c++-在线程之间发送信号,我们在S

c - 如何使用信号安全函数将格式化字符串写入文件?

目前我在信号处理程序中使用一些非信号安全函数,如fprintf、snprintf。但是我需要用像写这样的信号安全函数来替换它。但是write函数只使用一个缓冲区,或者一个非格式化的字符串。还有其他方法可以打印格式化字符串吗? 最佳答案 在信号处理程序中设置一个标志。然后在从信号处理程序返回后将命令写入文件。staticvolatilesig_atomic_tsig_rcvd=0;voidsig_hanlder(intsig){sig_rcvd=1;}如果sig_rcvd被设置然后写入文件并可能将sig_rcvd重置回0。这样你就可以

ruby - 在 linux 上的 ruby​​ 中,有没有办法获取捕获信号的 siginfo_t 数据?

我试图弄清楚哪个进程正在向我的一个ruby​​脚本发送信号。我能够捕获信号-有什么方法可以在我完成后找出发送它的进程吗?通常,这将在传递给信号处理程序的siginfo_t结构中-这在ruby​​中公开了吗? 最佳答案 查看有关ruby​​信号处理的文档,我会说此信息不可用。http://www.ruby-doc.org/core/classes/Signal.html 关于ruby-在linux上的ruby​​中,有没有办法获取捕获信号的siginfo_t数据?,我们在StackOver