我试图从网上找到的示例程序中了解信号在Linux中的工作方式,但是其中有些部分我并不太了解。
这是我的示例程序:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void catcher(int sig) {
printf("catcher() has gained control\n");
}
int main(int argc, char *argv[]) {
struct sigaction sigact;
sigset_t sigset;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigact.sa_handler = catcher;
sigaction(SIGUSR1, &sigact, NULL);
printf("before first kill()\n");
kill(getpid(), SIGUSR1);
sigemptyset(&sigset);
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_SETMASK, &sigset, NULL);
printf("before second kill()\n");
kill(getpid(), SIGUSR1);
printf("after second kill()\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的程序的示例输出:
在第一个kill()之前
catcher()
在第二个kill()
之后 获得了第二个kill()之前的控制权
我能知道为什么输出的第一行是before first kill()吗?为什么不catcher() has gained control首先出现?
据我所知,它sa_handler …
我正在编写一个程序,使用execl来执行我正在测试的exe文件,它的工作非常好,并在Linux CLI中显示输出.但我不知道如何将execl更改为execv,虽然我知道两个系统调用都会给出相同的值.我对execv系统调用的数组参数感到困惑
这是我的execl示例程序
int main(void)
{
int childpid;
if((childpid = fork()) == -1 )
{
perror("can't fork");
exit(1);
}
else if(childpid == 0)
{
execl("./testing","","",(char *)0);
exit(0);
}
else
{
printf("finish");
exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以知道如何将execl更改为execv.我从网上读到的,我们必须设置我的exe文件的文件路径和数组的参数.为了要求程序执行测试exe文件,需要为数组设置什么类型的参数?
https://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/execv.htm
链接是否包含我想要的内容?但是我从中读到的是,命令是请求列表文件,而不是执行文件.纠正我,我犯了任何错误