gpt4 book ai didi

c - 为什么 SIGUSR1 会杀死我的 dd 子进程?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:55 27 4
gpt4 key购买 nike

您好,我有一个简单的功能,我可以在其中创建子进程和父进程。

子进程假设运行 dd if=/some/file of=/somedisk。父进程假设在一个循环中运行(直到子进程存在)并发送信号 SIGUSR1,它强制子进程中的 dd 报告进度数据。

当然我有管道,我将 stdio 和 stderr 从 child 重定向到 parent 。 (我在其他功能中使用它并且工作正常)

我遇到的问题是:1. 我的 stderr 上什么也没有;2. 一旦我发送 SIGUSR1,进程就会以某种方式退出。

    if(my_pid>0) //The parent part
{

close(FD_pipe_stdout[1]);// Parent process closes output side of the pipe
close(FD_pipe_stderr[1]);// Parent process closes output side of the pipe
while(0==waitpid(my_pid, &my_pid_status, WNOHANG))
{
kill(my_pid, SIGUSR1);
sleep(1);
//read(FD_pipe_stderr[0], pipe_error,PIPE_MAX_SIZE); // Read in a string from the stderror
//puts(pipe_error);

}
puts("going out");
read(FD_pipe_stdout[0], pipe_output,PIPE_MAX_SIZE); // Read in a string from the pipe's input side

close(FD_pipe_stdout[0]);//on the end close the other side of pipe
close(FD_pipe_stderr[0]);//on the end close the other side of pipe
}
else
{ // The child part
close(FD_pipe_stdout[0]);/* Child process closes input side of the pipe */
close(FD_pipe_stderr[0]);/* Child process closes input side of the pipe */
dup2(FD_pipe_stdout[1],1); //redirect the stdout(1) to the fd_pipe and then close the sdtout
dup2(FD_pipe_stderr[1],2);//redirect also stderr to the pipe
system(dd if=/image.img of=/dev/sda);
close(FD_pipe_stdout[1]); //on the end close the other side of pipe
close(FD_pipe_stderr[1]); //on the end close the other side of pipe
exit(0);
}

我在屏幕上看到父级正在从 while 循环中退出,但我不明白为什么。

提前致谢

最佳答案

system() 创建一个子进程来运行指定的命令,所以这里实际上有三个进程:

  1. 父进程(有循环的那个)
  2. 子进程(调用 system()
  3. 的子进程
  4. dd 过程

您是在向子进程而不是 dd 进程发送信号。默认情况下,SIGUSR1 会导致进程退出,因此您正在终止子进程。

要解决此问题,您可以使用 exec 函数之一运行 dd,而不是调用 system():

{   // The child part
close(FD_pipe_stdout[0]);
close(FD_pipe_stderr[0]);
dup2(FD_pipe_stdout[1],1);
dup2(FD_pipe_stderr[1],2);
execlp("dd", "dd", "if=/image.img", "of=/dev/sda", NULL);
perror("exec failed");
exit(1);
}

现在你只有两个进程,因为子进程变成了 dd 进程。当 parent 向 child 发出信号时,信号将转到 dd

请注意,这里存在竞争条件。父进程可能会在 dd 启动并设置其信号处理程序之前发送 SIGUSR1 信号。为了稳健,您应该以某种方式处理这个问题。

关于c - 为什么 SIGUSR1 会杀死我的 dd 子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19433393/

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