Process.exec() problem
Peter Lovell <[email protected]> Mon, 11 Jul 2005 13:49:50 -0400
| Newsgroups | gmane.comp.java.vm.sablevm.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi folks,
I'm having a problem which I believe to be with exec'ing a process
and wonder if someone might be able to help. Sometimes another set of
eyeballs is all it takes.
The problem is an intermittent failure which appears to be a deadlock
somewhere. The frequency is about two or three times every hundred
tries. I've appended the java code below (small extract) and I can't
see any specific problem with it - after all it works -most- of the
time. Problem is that the call is made to this method and the process
then remains asleep. In a few instances, the process list shows a
zombie process...
31747 pts/49 Z+ 0:00 [who] <defunct>
A few items of background - I see this problem on Linux (SuSE 9.1,
kernel 2.6.4) and Mac OS X (10.4.1, dual processor G5). There had
been a couple of instances on Linux 2.4.20 SuSE 8.2 but that does not
seem to be happening now (more testing needed). Testing on Sun Java
has never produced a failure, even in days of testing. The sable
+classpath version is 1.1.8 but comparison of that code with current
doesn't seem to show any substantial difference in this area [I've
been trying today to get latest code but sablevm.org site is down,
unfortunately]
I'm suspecting a subtle timing issue within classpath as the root
cause. All suggestions gratefully accepted.
Thanks.....Peter
public String[] getConnectedUsers()
{
int count = 0;
int status = -1;
String s;
Runtime rt;
Process p;
ArrayList return_data = new ArrayList(32);
String[] cu = new String[0];
try {
rt = java.lang.Runtime.getRuntime();
p = rt.exec(("who"));
status = p.waitFor();
if (status != 0){
System.err.println("WARNING: 'who' failed,
getConnectedUsers failed");
return cu;
}
InputStream ain = p.getInputStream();
if ( ain == null ){
System.err.println("WARNING: 'who' missing,
getConnectedUsers failed");
return cu;
}
BufferedReader in = new BufferedReader( new
InputStreamReader ( ain ) );
if ( in == null ) {
System.err.print("getConnectedUsers: in is null -
command must have failed, status = ");
System.err.println(status);
} else {
while ( (s = in.readLine()) != null) {
if ( (s.length() < 1) || (s.substring(0,1).equals("#")))
continue; //ignore zero-length line (if any)
and the user count line
return_data.add(s.substring(0, 9).trim());
}
cu = (String[])return_data.toArray(new String
[return_data.size()]);
}
}
catch (InterruptedException ie) {
System.err.println("InterruptedException caught");
}
catch (IOException ioe) {
System.err.println("i/o error");
}
return cu;
}