您好我有一个简单的功能,我创建了一个子进程和父进程。
子进程假设运行dd if = / some / file of = / somedisk。 父进程假设在循环中运行(直到子进程存在)并发送SIGUSR1信号,该信号强制子进程中的dd报告进度数据。
当然我有管道,我将stdio和stderr从孩子重定向到父母。 (我在其他功能中使用,它工作正常)
我遇到的问题是: 我的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循环中走出来,我不明白为什么。
提前致谢
答案 0 :(得分:4)
system()
创建一个子进程来运行指定的命令,所以你真的有三个进程:
system()
您发出了子进程的信号,而不是 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 进程。当父母发信号通知孩子时,信号将转到 dd 。
请注意,此处存在竞争条件。父进程可以在 dd 启动之前发送SIGUSR1信号并设置其信号处理程序。为了变得强大,你应该以某种方式处理它。