<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-15">
</head>
<body bgcolor="#ffffff" text="#000000">
Hi,<br>
<br>
I would appreciate if someone can help me with the following problem:<br>
<br>
I want to have a communication on the root process (rank=0) in such a
way that single characters are read from the terminal.<br>
This is achieved in plain C by using termios.h and the functions
tcgetattr() and tcsetattr() as shown in the attached test program. With
gcc and Debian Linux this works fine.<br>
<br>
I translated the program with mpicc without any problems and started it
directly from the command line: it works well.<br>
Then I started it with<br>
<big><tt> mpiexec -f nodes -n 2 tioTestMPI <br>
</tt></big>and received the following:<br>
<br>
<big><tt>Waiting for input ...<br>
error with cbreak<br>
Waiting for input ...<br>
error with cbreak<br>
</tt></big><br>
A more detailed analysis shows that the call to "tcgetattr" yields the
error "Invalid argument". This was obtained by a subsequent call to
perror.<br>
<br>
A version including prior calls to <br>
<big><tt> MPI_Init(&argc, &argv);<br>
MPI_Comm_rank(MPI_COMM_WORLD, &rank);<br>
MPI_Comm_size(MPI_COMM_WORLD, &size);<br>
</tt></big>is given by the second program. It yields the same results:<br>
<big><tt>Waiting for input ...<br>
error with cbreak<br>
lazy slave<br>
</tt></big><br>
Thanks in advance<br>
Wilfried Jakob<br>
<br>
Here is the source code of the test program 1:<br>
=================================================<br>
#include <stdio.h><br>
#include <stdlib.h><br>
#include <termios.h><br>
#include <unistd.h><br>
<br>
static struct termios new_io;<br>
static struct termios old_io;<br>
<br>
int cbreak(int fd) {<br>
/* save old terminal settings */<br>
if((tcgetattr(fd, &old_io)) == -1)<br>
return -1;<br>
new_io = old_io;<br>
/* change terminal settings */<br>
new_io.c_lflag = new_io.c_lflag & ~(ECHO|ICANON);<br>
new_io.c_cc[VMIN] = 1;<br>
new_io.c_cc[VTIME]= 0;<br>
<br>
/* set new settings */<br>
if((tcsetattr(fd, TCSAFLUSH, &new_io)) == -1)<br>
return -1;<br>
return 1;<br>
}<br>
<br>
<br>
int getch(void) {<br>
int c;<br>
<br>
if(cbreak(STDIN_FILENO) == -1) {<br>
printf(" error with cbreak \n");<br>
exit(EXIT_FAILURE);<br>
}<br>
c = getchar();<br>
/* restore old terminal settings */<br>
tcsetattr(STDIN_FILENO, TCSANOW, &old_io);<br>
return c;<br>
}<br>
<br>
<br>
int main (int argc, char** argv)<br>
{<br>
int ii;<br>
<br>
printf ("Waiting for input ...\n");<br>
ii = getch ();<br>
printf (" read: \"%c\" = %d\n", (char)ii, ii);<br>
<br>
printf ("Waiting for input ...\n");<br>
ii = getch ();<br>
printf (" read: \"%c\" = %d\n", (char)ii, ii);<br>
<br>
printf ("\nfinished!\n");<br>
return 0;<br>
}<br>
=================================================<br>
<br>
Here is the source code of the test program 2:<br>
=================================================<br>
#include <stdio.h><br>
#include <stdlib.h><br>
#include <termios.h><br>
#include <unistd.h><br>
<br>
#include "mpi.h"<br>
<br>
static struct termios new_io;<br>
static struct termios old_io;<br>
<br>
<br>
int cbreak(int fd) {<br>
/* save old terminal settings */<br>
if((tcgetattr(fd, &old_io)) == -1)<br>
return -1;<br>
new_io = old_io;<br>
/* change terminal settings */<br>
new_io.c_lflag = new_io.c_lflag & ~(ECHO|ICANON);<br>
new_io.c_cc[VMIN] = 1;<br>
new_io.c_cc[VTIME]= 0;<br>
<br>
/* set new settings */<br>
if((tcsetattr(fd, TCSAFLUSH, &new_io)) == -1)<br>
return -1;<br>
return 1;<br>
}<br>
<br>
<br>
int getch(void) {<br>
int c;<br>
<br>
if(cbreak(STDIN_FILENO) == -1) {<br>
printf(" error with cbreak\n");<br>
exit(EXIT_FAILURE);<br>
}<br>
c = getchar();<br>
/* restore old terminal settings */<br>
tcsetattr(STDIN_FILENO, TCSANOW, &old_io);<br>
return c;<br>
}<br>
<br>
<br>
int main (int argc, char** argv)<br>
{<br>
int ii, rank, size;<br>
<br>
MPI_Init(&argc, &argv);<br>
MPI_Comm_rank(MPI_COMM_WORLD, &rank);<br>
MPI_Comm_size(MPI_COMM_WORLD, &size);<br>
<br>
if (rank == 0) { /* master */<br>
printf ("Waiting for input ...\n");<br>
ii = getch ();<br>
printf (" read: \"%c\" = %d\n", (char)ii, ii);<br>
<br>
printf ("Waiting for input ...\n");<br>
ii = getch ();<br>
printf (" read: \"%c\" = %d\n", (char)ii, ii);<br>
<br>
printf ("\nfinished!\n");<br>
} /* master */<br>
else<br>
printf ("lazy slave\n");<br>
<br>
MPI_Finalize();<br>
return 0;<br>
}<br>
=================================================<br>
<br>
</body>
</html>