Hello,
I noticed some odd behaviors with idlestate.c/execute() function.
1. I wrote a sample program hello.c with infinite loop -
int main() {
while(1);
}
#sudo ../idlestat/idlestat -o /tmp/myoutput ../temp/hello
idlestat never terminates, because there is no alarm set, hello program never terminates.
2. If I change and invoke idlestat with below command -
#sudo ../idlestat/idlestat -o /tmp/myoutput -t 5 ../temp/hello
idlestat outputs only below line and exits -
Total trace buffer: 153896 kB
What is happening is the below check fails -
if (WIFSIGNALED(status) && WTERMSIG(status) == SIGTERM) {
return 0;
}
here condition is always false. Because the status variable was fetched before killing the process. So status does not contain valid signal number.
if (waitpid(pid, &status, 0) < 0) {
if (errno != EINTR || !sigalrm)
goto again;
kill(pid, SIGTERM);
}
Possible Fix: call waitpid again after kill and fetch new status.
3. The below check makes idlestat dependent on the hello program run -
if (WIFEXITED(status) && !WEXITSTATUS(status)) {
}
If my program is written to return a non-zero value, the second condition will be always false.
So with the below program -
int main() {
return 1;
}
idlestat outputs only since WEXITSTATUS(status) returns nonzero value -
Total trace buffer: 153896 kB
Possible Fix: Just check WIFEXITED(status) and ommit the fetching of exit status.
In any case, it should not be allowed to run idlestat with "-t 0", since that will results in problem 1 again.
--
Thanks,
- Meraj