gpt4 book ai didi

c++ - C 中的 execv 调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:05 25 4
gpt4 key购买 nike

下面有一个简单的程序,它接受 HUP 并继续执行 execv。问题是当执行 execv 调用时,代码从 HUP 出现的地方继续。我想,在 execv 之后,代码必须从 main 退出,然后从 main 的开头重新开始。

char* a;
char** args;

void hup_func(){
printf("aaaa\n");
if(execv(a,args))
printf("bbb\n");
}

int main(int argc,char* argv[]){
signal(SIGHUP,hup_func);
args=argv;
a=args[0];
printf("%s\n",a);
while(1){
printf("test\n");
sleep(10);
}

return 0;
}

程序的名称是 deneme1。代码的输出是我发送HUP时的结果;

./deneme1
test
test
aaa
bbbb
test.

但是我想要的是,当我发送HUP的时候,它必须从main开始。像那样

./deneme1
test
test
aaa
bbb
./deneme1
test
...

我希望它在 HUP 之后返回到 main 的开头,而不是之前的地方

最佳答案

您没有向 execv 发送正确的参数,因此该函数正在退出并出现错误。因此,您只是退出信号处理程序,而不是用进程的新拷贝覆盖进程。

execv 的参数签名是:

int execv(const char *path, char *const argv[]); 

第二个参数应该是指向charconst 指针数组,最后一个元素是NULL 指针。您为第二个参数传递的 char* a 类型不正确。

最后,execv 不被视为 asynchronous signal-safe function ,因为它是姊妹函数,execve 是。你应该使用后者。这同样适用于任何 printf 函数系列......如果您需要写入终端,请改用 write

更新:我重新运行了您更新后的代码。程序正在正常重新启动,但问题是信号掩码是从调用 execv 覆盖的原始进程继承而来的。由于您从信号处理程序内部运行 execvSIGHUP 将在覆盖进程中被阻止,您将无法发送任何其他 SIGHUP 向进程发送信号。要撤消此操作,您需要在使用 signal() 分配信号处理程序后立即使用 sigprocmask() 解除阻止 SIGHUP 信号。

例如,将您的 main 更改为:

int main(int argc,char* argv[])
{
sigset_t signal_mask;

signal(SIGHUP,hup_func);

//unblock the SIGHUP signal if it's blocked
sigaddset(&signal_mask, SIGHUP);
sigprocmask(SIG_UNBLOCK, &signal_mask, NULL);

args=argv;
a=args[0];
printf("%s\n",a);
while(1){
printf("test\n");
sleep(10);
}

return 0;
}

我已经在 Ubuntu 12.04 上编译并运行了它,现在它运行完美。

关于c++ - C 中的 execv 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10223900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com