发送信号

发送信号

  –使用kill命令

•在命令行使用kill命令,向指定进程发送信号。

  –使用kill函数

#include <signal.h>

#include <sys/types.h>

int kill(pid_t pid, int sig);

•参数pid指定一个要杀死的进程,而sig是要发送的信号。

kill函数例子

int main(int arg, char *args[])
{
    if (arg > 1)
    {
        int pid = atoi(args[1]);
        kill(pid, SIGKILL);
    }
    else
    {
        printf("pid = %u\n",getpid());
        sleep(60);
    }
    return 0;
}

发送信号

  –使用raise函数

#include <signal.h>

int raise(int signo);

kill函数将信号发送给进程,raise函数允许进程向自身发送信号;

raise(signo)等价于kill(getpid(), signo)。

alarm函数设置了一个定时器,当定时器到了就发送SIGALRM信号。

#include <unistd.h>

nsigned int alarm(unsigned int seconds);

seconds是计时器时间到后时钟的秒数。

如果没有设置其他超时,函数返回0,否则返回值为前面安排超时中保留的秒数

一个进程只能设置一次超时

把seconds设置为0可以取消前面的超时设置。

alarm函数例子

void catch_Signal(int Sign)
{
    switch(Sign)
    {
    case SIGALRM:
        printf("SIGALRM Signal\n");
    }
}
int main(int arg, char *args[])
{
    signal(SIGALRM, catch_Signal);
    alarm(1);
    pause();
    return 0;
}

abort函数。

void abort(void);

该函数发送SIGABRT信号给调用进程,进程不应该忽略这个信号。

即使进程捕捉到SIGABRT这个信号,进程还是会异常退出。

让进程捕捉SIGABRT的意图是,在进程终止前由其执行所需的清理操作。

sleep函数。

nsigned int sleep(unsigned int seconds);

参数seconds指定了睡眠时间。

超过seconds指定时间,函数返回。

调用进程捕捉到一个信号并从信号处理程序返回。

作业控制信号。

  –SIGCHLD-子进程已停止或终止;

  –SIGCONT-如果进程已经停止,使其继续运行;

  –SIGSTOP-停止信号,不能被捕捉或者忽略;

  –SIGTTIN-后台进程组成员读控制终端;

  –SIGTTOU-后台进程组成员写到控制终端。

除SIGCHLD以外,大多数程序并不处理这些信号。

Shell程序一般需要处理些信号。

信号用于大多数复杂的应用程序中。

理解信号处理对于Linux编程非常重要。

复制去Google翻译翻译结果

时间: 2024-10-25 12:01:20

发送信号的相关文章

Linux 发送信号

使用kill命令 --在命令行执行kill命令.向指定进程发送信号. 使用kill函数 int kill(pid_t pid,int sig); --参数pid指定一个要杀死的进程,而sig是要发送的信号. //kill函数发送信号 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include &

QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)

QThread 继承 QObject..它可以发送started和finished信号,也提供了一些slot函数. QObject.可以用于多线程,可以发送信号调用存在于其他线程的slot函数,也可以postevent给其他线程中的对象.之所以可以这样做,是因为每个线程都有自己的事件循环. 在进行下面的讲解之前,应该了解的重要的一点是:QThread 对象所在的线程,和QThread 创建的线程,也就是run()函数执行的线程不是同一个线程.QThread 对象所在的线程,就是创建对象的线程.我

我使用过的Linux命令之kill - 终止进程/发送信号

用途说明 kill命令用于终止指定的进程(terminate a process),是Unix/Linux下进程管理的常用命令.通常,我们在需要终止某个或某些进程时,先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程.kill命令的另外一个用途就是向指定的进程或进程组发送信号(The  command kill sends the specified signal to the specified process or process group)

Linux 命令 - killall: 通过进程名向进程发送信号

命令格式 killall [-Z CONTEXT] [-u USER] [ -eIgiqrvw ] [ -SIGNAL ] NAME... killall -l, --list killall -V, --version 命令参数 -e, --exact 对于长名字,要求精确匹配.如果一个命令名的长度超过 15 字符,则可能不会用完整的名字.这种情况下,killall 会杀死名字匹配前 15 个字符的进程.使用 -e 选项,则会要求进程名字完全匹配. -I, --ignore-case 匹配进程

linux驱动的异步通知(kill_fasync,fasync)---- 驱动程序向应用程序发送信号

应用程序 [cpp] view plain copy #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <poll.h> #include <signal.h> #include <sys/types.h> #include <unistd.h> #include <fcn

block的是发送信号的线程,又不是处理槽函数的线程

请问UI线程给子线程发信号,应该用哪种连接方式? 如果子线程正在执行一个函数,我发射信号去执行子线程的另一个函数,那么此时子线程到底会执行什么呢? 用信号量做的同步.第一把信号槽的事件丢到线程的事件队列,第二信号量等待,等到事件处理完触发,继续执行主线程逻辑.子线程还是处理事件,只是信号槽的槽函数执行完,会做信号量的操作… 连接的时候,那就不需要block? 因为信号量已经控制好了?需要,你只有指定那个连接参数才有信号量的操作… block的是发送信号的线程,又不是处理槽函数的线程…给槽函数线程

Qt跨线程发送信号与元数据

转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39395025 Qt的signals/slots是可以用在线程间的.由于事件循环(event loop)是在主线程完成的,所以在非主线程发送一个信号时,对应的槽函数将会由主线程执行. 熟悉多线程的读者应该都感受到这里会有一个微妙的问题.如果signals/slots的函数参数是一个自己定义的类型.比如自己定义了一个Student类,信号函数为sendStudent(const Stude

pthread中向线程发送信号

pthread_kill 语法 int pthread_kill(thread_t tid, int sig); #include <pthread.h> #include <signal.h> int sig; pthread_t tid; int ret; ret = pthread_kill(tid, sig); pthread_kill() 将信号 sig 发送到由 tid 指定的线程.tid 所指定的线程必须与调用线程在同一个进程中.sig 参数必须来自 signal(5

shell向子进程发送信号

处理包含子进程的脚本,假设您希望终止任意子进程,那么还需要停止这些脚本.trap 命令完成此操作. 子进程 以 & 运行的子进程,最为后台程序运行,父进程与子进程之间为异步 已直接方式运行子进程,此时子进程在前台运行,父进程与子进程之间为同步 sleep 10 #等待10秒,再继续下一操作 sleep 10 & #当前shell不等待,后台子shell等待 trap Unix system by design doesn't allow any script/program to trap