How to clear the content of a pipe (STDIN) after it is written to another program?


 
Thread Tools Search this Thread
Top Forums Programming How to clear the content of a pipe (STDIN) after it is written to another program?
# 1  
Old 05-14-2008
How to clear the content of a pipe (STDIN) after it is written to another program?

PROGRAM A <-> PROGRAM B
PROGRAM A sends data as STDIN ro PROGRAM B and when PROGRAM B is executed from PROGRAM A, it sends output back to PROGRAM A. This is implemented using 2 pipes (fd1 & fd2).

The above process happens in a loop and during the second run, the previous data that had been written as STDIN to PROGRAM B, it does not get cleared. The input data on STDIN to PROGRAM B just gets overwritten and the extra characters just stay there.

How to clear the STDIN to PROGRAM B? Existing code as follows:

PROGRAM A
Code:
int StartPipe(iosockinet &s, char input_to_program_b[])
{
    int fd1[2];
    int fd2[2];
    pid_t pid;
    char line[MAXLINE];


    if (signal(SIGPIPE, sig_pipe) == SIG_ERR)
    {
        cerr << "signal error" << endl;
        return -1;
    }

    if ( (pipe(fd1) < 0) || (pipe(fd2) < 0) )
    {
        cerr << "PIPE ERROR" << endl;
        return -2;
    }
    if ( (pid = fork()) < 0 )
    {
        cerr << "FORK ERROR" << endl;
        return -3;
    }
    else  if (pid == 0)     // CHILD PROCESS
    {
        close(fd1[1]);
        close(fd2[0]);

        if (fd1[0] != STDIN_FILENO)
        {
            if (dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO)
            {
                cerr << "dup2 error to stdin" << endl;
            }
            close(fd1[0]);
        }

        if (fd2[1] != STDOUT_FILENO)
        {
            if (dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO)
            {
                cerr << "dup2 error to stdout" << endl;
            }
            close(fd2[1]);
        }
        if ( execl("path/PROGRAM_B", "PROGRAM_B", (char *)0) < 0 )
        {
            cerr << "system error" << endl;
            return -4;
        }

        return 0;
    }
    else        // PARENT PROCESS
    {
        int rv;
        close(fd1[0]);
        close(fd2[1]);

        if ( write(fd1[1], input_to_program_b, strlen(input_to_program_b) ) != strlen(input_to_program_b) )
        {
            cerr << "READ ERROR FROM PIPE" << endl;
        }

        if ( (rv = read(fd2[0], line, MAXLINE)) < 0 )
        {
            cerr << "READ ERROR FROM PIPE" << endl;
        }
        else if (rv == 0)
        {
            cerr << "Child Closed Pipe" << endl;
            return 0;
        }

        // PRINTING OUT THE RESULT ON SOCKET
        s << line << endl;

        return 0;
    }
    return 0;
}

The PROGRAM A code shown above is in a while condition loop, which can run more than once not exiting the program.

PROGRAM B
Code:
# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <string>
# include <sstream>

# define MAXLEN 10000

using namespace std;

int
main(int argc, char * argv[])
{

        char line[MAXLEN] = {0};

        string output;
        string echo_output;
        int line_length;

        read(STDIN_FILENO, line, MAXLEN);

        output = line;
        echo_output = "echo " + output;
        system(echo_output.c_str());

}

Just to check if correct data is got as input to PROGRAM B, we are just reading STDIN and echoing back on STDOUT. Previous data (without PROGRAM A exiting) stays on STDIN of PROGRAM B, which needs to be cleared before writing new input data to STDIN of PROGRAM B.

Thanks,
vivek
# 2  
Old 05-14-2008
Re-direct STDIN

Before reading data on the second pipe the parent process needs to redirect its standard input to fd2[0].

Code:
dup2(fd2[0], STDIN_FILENO);

# 3  
Old 05-14-2008
Thanks for the reply shamrock, but it is not solving the problem.

I am able to read the output of PROGRAM B inside PROGRAM A through char line[]. I am receiving output. But the problem is, the output in the previous run (until program exited) is not getting erased. Able to see new run results overwritten on previous results through char line[] of PROGRAM A AFTER read(fd2[0], line, MAXLINE).

Thanks,
Vivek
# 4  
Old 05-14-2008
The process needs to read() data off the pipe in order to clear it otherwise it blocks and stays in the pipe. Invoke read() after exec'ing program B in the child process.
# 5  
Old 05-14-2008
can you please tell me the syntax?

According to the code above, am already reading from the pipe after exec'ing program B. Can you please point in code if I had done anything wrong?

Thanks,
Vivek

Last edited by vvaidyan; 05-14-2008 at 05:01 PM..
# 6  
Old 05-14-2008
Program unclear

Explain your program...does program A have a main() like program B does or is it common to both A and B. I don't understand what's going on unless you provide more details.
# 7  
Old 05-14-2008
Shamrock, sorry about not providing proper details previously.

Program A does have main() fn separately. Program A and B are completely two different programs, just that Program B is called through execl() in Program A.

Following are additional details on Program A.

PROGRAM A

Code:
int
main(int argc, char *argv[])
{
     // This program accepts several customized options through socket.
     // The option/module I am writing is called SearchFiles
     // This program does not exit until another option Terminate is called through client socket
     // Meaning, SearchFiles option can be called more than once
     // SearchFiles does operation nothing to do with pipes. it does a customized path translation. 
     // The data that it passes to StartPipe() method is only the socket and the path in a char array as below:

     sockinetbuf s;
     string socket_data;
     s >> socket_data;
     while(s)
     {
          s >> socket_data;

          if (socket_data == "SearchFiles")
          {
               char input_to_program_b[1000] = "blah blah blah";
               StartPipe(s, input_to_program_b);
          }
          else if (socket_data == "Terminate")
          {
               exit(0);
          }
     }
}

Function StartPipe() is as given in the first post.

Thanks,
Vivek

Last edited by vvaidyan; 05-14-2008 at 06:35 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Clear standard input buffer for C program in Linux

Hello friends! i am writing a code in which i take inputs (numbers) from user and count the total number of positive, negative and zeros entered. I need to clear my standard input buffer before scanf() command. My compiler is completely ignoring the fflush(stdin) command. its not even showing any... (1 Reply)
Discussion started by: Abhishek_kumar
1 Replies

2. Programming

Debugging a program written in two languages

Subject: Debugging a program written in two languages Platform: Linux (Kubuntu) I am trying to debug a C application with bindings to some simple functions written in Ada using the GNAT Programming Studio IDE (GPS). The main entry point is in C. The debugger is gdb. I managed to compile... (0 Replies)
Discussion started by: NiGHTS
0 Replies

3. Programming

How to prevent a C++ program reading a file that is still being written to.?

Hi, Hopefully someone can help. We have a process that writes a file using Connect Direct to our local Solaris server and then our C++ program will pick up the file and process it. Unfortunately, because of the size of the file, the C++ program is processing the file before it has finished... (7 Replies)
Discussion started by: chris01010
7 Replies

4. UNIX for Dummies Questions & Answers

No process to read data written to a pipe on AIX

We use SAP application cluster on AIX. Communication between 2 of its instances is failing randomly with the following error: java.net.SocketException: There is no process to read data written to a pipe. The above error causes a cluster restart if an important communication fails. Can... (0 Replies)
Discussion started by: RoshniMehta
0 Replies

5. AIX

Tape drive problem - no process to read data written to a pipe

Hi Everyone, The machine I'm working on is an AIX 5.3 LPAR running on a P650. oslevel -r shows 5300-08. I'm trying to take a backup to a SCSI tape drive, which has been working up until this point. I know of nothing that has changed recently to cause this problem. But when I try to take a... (0 Replies)
Discussion started by: need2bageek
0 Replies

6. UNIX for Advanced & Expert Users

AIX 5.3 - There is no process to read data written to a pipe

I have the following code which works on AIX 4.3 but fails at times on AIX 5.3 with: cat: 0652-054 cannot write to output. There is no process to read data written to a pipe. validator="${validator_exe} ${validator_parms}" cmd_line="${CAT} ${data_file} | ${validator}... (6 Replies)
Discussion started by: vigsgb
6 Replies

7. UNIX for Dummies Questions & Answers

How to write to stdin of another program (program A -> [stdin]program B)

Hi, Program A: uses pipe() I am able to read the stdout of PROGAM B (stdout got through system() command) into PROGRAM A using: * child -> dup2(fd, STDOUT_FILENO); -> execl("/path/PROGRAM B", "PROGRAM B", NULL); * parent -> char line; -> read(fd, line, 100); Question: ---------... (3 Replies)
Discussion started by: vvaidyan
3 Replies

8. Shell Programming and Scripting

Perform action file name written to the pipe

Hello, I have a script that monitors files uploaded via ftp. After a successful upload, the file name is written to the pipe. There is another program that reads this pipe and allows automatically run any program or script ( say test.sh ) to process the newly uploaded file. cat test.sh... (2 Replies)
Discussion started by: fed.linuxgossip
2 Replies

9. Programming

C++ How to use pipe() & fork() with stdin and stdout to another program

Hi, Program A: uses pipe() I am able to read the stdout of PROGAM B (stdout got through system() command) into PROGRAM A using: * child -> dup2(fd, STDOUT_FILENO); -> execl("/path/PROGRAM B", "PROGRAM B", NULL); * parent -> char line; -> read(fd, line, 100); Question:... (2 Replies)
Discussion started by: vvaidyan
2 Replies

10. Programming

How to write to stdin of another program (program A -> [stdin]program B)

Hi, Program A: uses pipe() I am able to read the stdout of PROGAM B (stdout got through system() command) into PROGRAM A using: * child -> dup2(fd, STDOUT_FILENO); -> execl("/path/PROGRAM B", "PROGRAM B", NULL); * parent -> char line; -> read(fd, line, 100); Question: ---------... (1 Reply)
Discussion started by: vvaidyan
1 Replies
Login or Register to Ask a Question