小编doe*_*doe的帖子

Linux中用于C的信号处理

我试图从网上找到的示例程序中了解信号在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 …

c linux signals

5
推荐指数
1
解决办法
753
查看次数

如何在linux中使用execv系统调用?

我正在编写一个程序,使用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

链接是否包含我想要的内容?但是我从中读到的是,命令是请求列表文件,而不是执行文件.纠正我,我犯了任何错误

c unix linux exec

4
推荐指数
2
解决办法
3万
查看次数

标签 统计

c ×2

linux ×2

exec ×1

signals ×1

unix ×1