c++ 陷阱命令未在/bin/sh脚本中触发

50pmv0ei  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(145)

我有一个/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脚本,陷阱未在脚本中触发

jq6vz3qz

jq6vz3qz1#

exec()函数家族用新进程映像替换当前进程映像,因此通过调用execvp(),C代码的其余部分将不再存在。
使用spawn()系列中的一个来启动CHILD进程。

相关问题