Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用signal、handler、kill和getpid_C_Signals_Kill - Fatal编程技术网

在C中使用signal、handler、kill和getpid

在C中使用signal、handler、kill和getpid,c,signals,kill,C,Signals,Kill,我正在学习C语言和系统编程。我需要创建三个信号处理程序,一旦它们被创建,程序应该按照以下顺序向自身发送信号:SIGUSR1、SIGUSR2和SIGINT。下面是我的代码。它不工作(例如,当我在terminal-I-type./prog1中编译并单击control-C时,程序应该打印“捕获信号,退出”并退出。我没有收到任何错误,但它只是返回到下一行,没有任何内容。有人可以看一下并为我指出正确的方向吗?非常感谢您的帮助 #include <signal.h> #include <s

我正在学习C语言和系统编程。我需要创建三个信号处理程序,一旦它们被创建,程序应该按照以下顺序向自身发送信号:SIGUSR1、SIGUSR2和SIGINT。下面是我的代码。它不工作(例如,当我在terminal-I-type./prog1中编译并单击control-C时,程序应该打印“捕获信号,退出”并退出。我没有收到任何错误,但它只是返回到下一行,没有任何内容。有人可以看一下并为我指出正确的方向吗?非常感谢您的帮助

#include <signal.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

static void sigHandler_sigusr1(int sig)
{
    //sig contains the signal number that was received
    printf("Caught SIGUSR1\n", getpid());
    kill(getpid(), SIGUSR1);
}

static void sigHandler_sigusr2(int sig)
{
    //sig contains the signal number that was received
    printf("Caught SIGSR2\n", getpid());
    kill(getpid(), SIGUSR2);
}

static void sigHandler_sigint(int sig)
{
    //sig contains the signal number that was received
    printf("Caught SIGINT, Exiting\n", getpid());
    kill(getpid(), SIGINT);
    exit(EXIT_SUCCESS);
}


int main(int argc, char *argv[])
{
    if (signal(SIGUSR1, sigHandler_sigusr1) == SIG_ERR)
        printf("Unable to create handler for SIGUSR1\n");

    if (signal(SIGUSR2, sigHandler_sigusr2) == SIG_ERR)
        printf("Unable to create handler for SIGUSR2\n");

    if (signal(SIGINT, sigHandler_sigint) == SIG_ERR)
        printf("Unable to create handler for SIGUSR1\n");

    return 0;
}
#包括
#包括
#包括
#包括
#包括
静态无效信号发生器1(内部信号)
{
//sig包含接收到的信号号
printf(“捕获的SIGUSR1\n”,getpid());
kill(getpid(),SIGUSR1);
}
静态无效信号发生器2(内部信号)
{
//sig包含接收到的信号号
printf(“捕获的SIGSR2\n”,getpid());
kill(getpid(),SIGUSR2);
}
静态无效信号发生器(信号发生器)
{
//sig包含接收到的信号号
printf(“捕获信号,正在退出”,getpid());
kill(getpid(),SIGINT);
退出(退出成功);
}
int main(int argc,char*argv[])
{
if(信号(SIGUSR1,sigHandler_SIGUSR1)=SIG_ERR)
printf(“无法为SIGUSR1创建处理程序\n”);
如果(信号(SIGUSR2,sigHandler_SIGUSR2)=SIG_ERR)
printf(“无法为SIGUSR2创建处理程序\n”);
中频(信号(SIGINT,sigHandler\u SIGINT)=SIG\u ERR)
printf(“无法为SIGUSR1创建处理程序\n”);
返回0;
}

您的主程序没有等待接收信号。发生的情况是主程序启动并检查条件是否正确,然后立即返回0

为了理解

在主程序中括起
(1)
,现在点击ctr+C。您将获得预期的输出

#include <signal.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
static void sigHandler_sigusr1(int sig)
{
    //sig contains the signal number that was received
    printf("Caught SIGUSR1\n");
    kill(getpid(), SIGUSR1);
}
static void sigHandler_sigusr2(int sig)
{
    //sig contains the signal number that was received
    printf("Caught SIGSR2\n");
    kill(getpid(), SIGUSR2);
}
static void sigHandler_sigint(int sig)
{
    //sig contains the signal number that was received
    printf("Caught SIGINT, Existing\n", getpid());
    kill(getpid(), SIGINT);
    exit(EXIT_SUCCESS);
}
int main(int argc, char *argv[])
{
        if (signal(SIGUSR1, sigHandler_sigusr1) == SIG_ERR)
            printf("Unable to create handler for SIGUSR1\n");
        if (signal(SIGUSR2, sigHandler_sigusr2) == SIG_ERR)
            printf("Unable to create handler for SIGUSR2\n");
        if (signal(SIGINT, sigHandler_sigint) == SIG_ERR)
            printf("Unable to create handler for SIGUSR1\n");
        while(1){
         /*some work*/
        }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
静态无效信号发生器1(内部信号)
{
//sig包含接收到的信号号
printf(“捕获信号1\n”);
kill(getpid(),SIGUSR1);
}
静态无效信号发生器2(内部信号)
{
//sig包含接收到的信号号
printf(“捕获的SIGSR2\n”);
kill(getpid(),SIGUSR2);
}
静态无效信号发生器(信号发生器)
{
//sig包含接收到的信号号
printf(“捕获的SIGINT,现有的”,getpid());
kill(getpid(),SIGINT);
退出(退出成功);
}
int main(int argc,char*argv[])
{
if(信号(SIGUSR1,sigHandler_SIGUSR1)=SIG_ERR)
printf(“无法为SIGUSR1创建处理程序\n”);
如果(信号(SIGUSR2,sigHandler_SIGUSR2)=SIG_ERR)
printf(“无法为SIGUSR2创建处理程序\n”);
中频(信号(SIGINT,sigHandler\u SIGINT)=SIG\u ERR)
printf(“无法为SIGUSR1创建处理程序\n”);
而(1){
/*一些工作*/
}
返回0;
}
不要在信号处理程序中使用printf。有关详细信息,请参阅。

Modified
main()
将起作用

int main(int argc, char *argv[])
{
    if (signal(SIGUSR1, sigHandler_sigusr1) == SIG_ERR)
        printf("Unable to create handler for SIGUSR1\n");

    if (signal(SIGUSR2, sigHandler_sigusr2) == SIG_ERR)
        printf("Unable to create handler for SIGUSR2\n");

    if (signal(SIGINT, sigHandler_sigint) == SIG_ERR)
        printf("Unable to create handler for SIGUSR1\n");

   while(1)
   {
         sleep(1);
   }

    return 0;
}
在代码中,注册信号处理程序后,执行完成。
while(1)
被添加以保持代码运行,因此当按下
CTRL+C
时,将调用处理程序

同时为
getpid()
函数添加
#包括
,并在中添加
%d

printf("Caught SIGSR2\n", getpid());

您是否尝试在返回之前放置一段时间(1)?并添加%d以打印getpid()。“…程序应按以下顺序向自身发送信号:…”要使其像
main()
那样执行,应采取措施启动此操作,但目前它没有。