Sponsored Content
Top Forums Programming Redirecting Terminal to Local Application! Post 302480651 by Corona688 on Wednesday 15th of December 2010 11:52:19 AM
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..
 

10 More Discussions You Might Find Interesting

1. 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

2. 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

3. 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

4. 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

5. 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

6. 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

7. 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

8. 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

9. 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

10. 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
All times are GMT -4. The time now is 01:52 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy