我有一个/bin/sh脚本,其中包含如下陷阱命令。
#!/bin/sh
# Define signal handler function
sigint_handler() {
echo "Received SIGTERM signal."
exit 1
}
# Set up signal handler
trap sigint_handler TERM
# Wait for a signal
echo "Waiting for signal..."
while [ 1 ]
do
sleep 4m&
p="$!"
wait
unset p
done
如果我单独运行该脚本,它将按预期工作。如果我使用kill-15 pid kill获取打印“接收到SIGTERM信号”。如果我使用execvp从C程序启动相同的脚本,脚本将启动,但陷阱不会触发。下面是生成进程并将pid和waitpid状态(ws)返回给调用者的C函数。注意:-此函数从多个线程调用。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h> /* for 'printf' and 'NULL' */
#include <stdlib.h> /* for 'errno' */
#include <errno.h>
pid_t fork_process (pid_t &new_pid,string process_start(here test.sh)){
int ws;
int status;
printf("Parent: %d\n", getpid());
char *args[]={"./test.sh",NULL}
pid = fork();
if (pid == 0){
printf("Child %d\n", getpid());
int r=execvp(args[0],args);
if (r < 0) {
const int err = errno;
printf( "exec failed with errno: %d", err);
exit(err);
}
}
new_pid=pid;
ws=waitpid(pid, &status, WNOHANG);
printf("%d\n",ws);
return ws;
}
有什么建议吗?
使用来自c/c++代码的execvp启动/bin/sh脚本,陷阱未在脚本中触发
1条答案
按热度按时间jq6vz3qz1#
exec()函数家族用新进程映像替换当前进程映像,因此通过调用execvp(),C代码的其余部分将不再存在。
使用spawn()系列中的一个来启动CHILD进程。