lucat
asked on
Redirecting stdin/stdout/stderr [Linux]
Hello,
i need to run a command-line program, read its stdout/stdin and write its stdin.
In few words i need to do what this python script does:
import popen2
r,w,e = popen2.popen3('mount -t reiserfs ./MyDisks/ecnrypteddisk ./mnt/mydisk -o loop,encryption=AES256,rw -p 0');
w.write('password');
w.close();
for line in e.readlines():
print 'E: ' + line
for line in r.readlines():
print 'R: ' + line
r.close();
e.close();
Thank you,
Luca
i need to run a command-line program, read its stdout/stdin and write its stdin.
In few words i need to do what this python script does:
import popen2
r,w,e = popen2.popen3('mount -t reiserfs ./MyDisks/ecnrypteddisk ./mnt/mydisk -o loop,encryption=AES256,rw -p 0');
w.write('password');
w.close();
for line in e.readlines():
print 'E: ' + line
for line in r.readlines():
print 'R: ' + line
r.close();
e.close();
Thank you,
Luca
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Ah, popen3 also dups stderr (fd=2). But then it gets messy for your program, as you need non-blocking I/O. You'd better just do a dup2 for stderr, also redirecting it to the stdout pipe.
ASKER
Hmmm why this doesn't work?
It segfault on me... even thought the "ls" command is correctly executed (i know it because if i write "kwrite" instead than "ls" kwrite shows up).
I believe i am doing something wrong with fscanf (if i comment it out it doesn't give any error).
Is it correct how i use dup2?
Thanx,
Luca
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
int fdin[2];
int fdout[2];
int fderr[2];
pid_t pid;
char s[256];
pipe(fdin);
pipe(fdout);
pipe(fderr);
pid = fork();
if (pid == (pid_t) 0) {
close(fdin[1]);
close(fdout[1]);
close(fderr[1]);
dup2(fdin[0],STDIN_FILENO) ;
dup2(fdout[0],STDOUT_FILEN O);
dup2(fderr[0],STDERR_FILEN O);
execlp("ls","ls",0);
}
else {
close(fdin[0]);
close(fdout[0]);
close(fderr[0]);
FILE* streamin;
FILE* streamout;
FILE* streamerr;
streamin = fdopen(fdin[1],"w");
streamout = fdopen(fdout[1],"r");
streamerr = fdopen(fderr[1],"r");
fscanf(streamout,"%[^]",s) ;
printf("%s",s);
close(fdin[1]);
close(fdout[1]);
close(fderr[1]);
waitpid(pid, NULL, 0);
}
return 0;
}
It segfault on me... even thought the "ls" command is correctly executed (i know it because if i write "kwrite" instead than "ls" kwrite shows up).
I believe i am doing something wrong with fscanf (if i comment it out it doesn't give any error).
Is it correct how i use dup2?
Thanx,
Luca
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
int fdin[2];
int fdout[2];
int fderr[2];
pid_t pid;
char s[256];
pipe(fdin);
pipe(fdout);
pipe(fderr);
pid = fork();
if (pid == (pid_t) 0) {
close(fdin[1]);
close(fdout[1]);
close(fderr[1]);
dup2(fdin[0],STDIN_FILENO)
dup2(fdout[0],STDOUT_FILEN
dup2(fderr[0],STDERR_FILEN
execlp("ls","ls",0);
}
else {
close(fdin[0]);
close(fdout[0]);
close(fderr[0]);
FILE* streamin;
FILE* streamout;
FILE* streamerr;
streamin = fdopen(fdin[1],"w");
streamout = fdopen(fdout[1],"r");
streamerr = fdopen(fderr[1],"r");
fscanf(streamout,"%[^]",s)
printf("%s",s);
close(fdin[1]);
close(fdout[1]);
close(fderr[1]);
waitpid(pid, NULL, 0);
}
return 0;
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.