On Wed, 8 Feb 2023, Shaopeng Tan (Fujitsu) wrote:
On Tue, 31 Jan 2023, Shaopeng Tan wrote:
After creating a child process with fork() in CAT test, if an error occurs or a signal such as SIGINT is received, the parent process will be terminated immediately, and therefor the child process will not be killed and also resctrlfs is not unmounted.
There is a signal handler registered in CMT/MBM/MBA tests, which kills child process, unmount resctrlfs, cleanups result files, etc., if a signal such as SIGINT is received.
Commonize the signal handler registered for CMT/MBM/MBA tests and reuse it in CAT too.
To reuse the signal handler, make the child process in CAT wait to be killed by parent process in any case (an error occurred or a signal was received), and when killing child process use global bm_pid instead of local bm_pid.
Also, since the MBA/MBA/CMT/CAT are run in order, unregister the signal handler at the end of each test so that the signal handler cannot be inherited by other tests.
Signed-off-by: Shaopeng Tan tan.shaopeng@jp.fujitsu.com
if (bm_pid == 0) { /* Tell parent that child is ready */ close(pipefd[0]); pipe_message = 1; if (write(pipefd[1], &pipe_message, sizeof(pipe_message)) <
sizeof(pipe_message)) {
close(pipefd[1]);
sizeof(pipe_message))
/*
* Just print the error message.
* Let while(1) run and wait for itself to be killed.
*/ perror("# failed signaling parent process");
If the write error is ignored here, won't it just lead to parent hanging forever waiting for the child to send the message through the pipe which will never come?
If the write error is ignored here, the pipe will be closed by "close(pipefd[1]);" and child process will wait to be killed by "while(1)".
return errno;
}
close(pipefd[1]); while (1)
If all file descriptors referring to the write end of a pipe have been closed, then an attempt to read(2) from the pipe will see end-of-file (read(2) will return 0). Then, "perror("# failed reading from child process");" occurs.
} else { /* Parent waits for child to be ready. */ close(pipefd[1]); pipe_message = 0; while (pipe_message != 1) { if (read(pipefd[0], &pipe_message, sizeof(pipe_message)) < sizeof(pipe_message)) { perror("# failed reading from child process"); break; } } close(pipefd[0]); kill(bm_pid, SIGKILL); signal_handler_unregister(); }
Ah, indeed read() will pick up the close event. So your code seem fine after all.