calling GNUPLOT from a c++ program

J

Joseph Suprenant

Hello all,
I have a C++ program, it does some calculations on things and then
prints out a file in the format in which GNUPLOT can use. So my question is
how would i call GNUPLOT from my C++ program. I know in some operating
systems you can do system("gnuplot"); But not with red hat 7.3. So could
some kind soul help me out? After it starts up GNUPLOT my program will
terminate.
Thanks
 
M

Moonlit

Hi,

Joseph Suprenant said:
Hello all,
I have a C++ program, it does some calculations on things and then
prints out a file in the format in which GNUPLOT can use. So my question is
how would i call GNUPLOT from my C++ program. I know in some operating
systems you can do system("gnuplot"); But not with red hat 7.3. So could
some kind soul help me out? After it starts up GNUPLOT my program will
terminate.

Strange, that shouldn't happen. Did you try to intercept all signals? Likely
your program terminates because it gets a signal that it isn't expecting.


Here is some code:

void CCSFilt::SignalReloadFilters( int Dummy )
{
GoReloadFilters = true; // Reload on next alarm
signal( SIGUSR1, SignalReloadFilters );

}

signal( SIGUSR1, SignalReloadFilters );

Do this for all signals and see which one is sent.
Regards, Ron AF Greve.
 
J

Joseph Suprenant

are you talking to me?
I don't get it
Moonlit said:
Hi,

question

Strange, that shouldn't happen. Did you try to intercept all signals? Likely
your program terminates because it gets a signal that it isn't expecting.


Here is some code:

void CCSFilt::SignalReloadFilters( int Dummy )
{
GoReloadFilters = true; // Reload on next alarm
signal( SIGUSR1, SignalReloadFilters );

}

signal( SIGUSR1, SignalReloadFilters );

Do this for all signals and see which one is sent.

Regards, Ron AF Greve.
 
M

Moonlit

Hi,


Joseph Suprenant said:
are you talking to me?
Yes.

I don't get it

What I meant is that your program shouldn't terminate when it uses the
system command. Likely that your program receives a signal. Some signals may
terminate (abort) your program when you do not intercept them. Use "man
signal" (I believe it is man 5 signal but am not sure) to see the signals
that might be sent.

Try to intercept them so they do not terminate your program. This you can do
with the following code.

void SignalCHLD( int Dummy )
{
signal( SIGCHLD, SignalCHLD );
fprintf( stderr, "SIGCHLD received" ); // Not actually allowed
normally, but will work most of the time.
}



signal( SIGCHLD, SignalCHLD ); // Do this for all possible signals!
system( "gnuplot" );

Do this for all signals and see what signals your program receives.

Regards, Ron AF Greve.
 
J

Joseph Suprenant

well my original problem still exists how do i start GNUPLOT from my C++
program?
 
F

Frank Schmitt

Joseph Suprenant said:
well my original problem still exists how do i start GNUPLOT from my C++
program?

Please don't top post.
Using system() is the right way to call an external program like gnuplot
from C++ - if it doesn't work properly, your problem must lie elsewhere.
Post some code.

regards
frank
 
C

Christian Gollwitzer

Joseph said:
Hello all,
I have a C++ program, it does some calculations on things and then
prints out a file in the format in which GNUPLOT can use. So my question is
how would i call GNUPLOT from my C++ program. I know in some operating
systems you can do system("gnuplot");
system is useless since then you can't pass any commands to GNUplot
But not with red hat 7.3. So could
some kind soul help me out? After it starts up GNUPLOT my program will
terminate.

I've done this on Linux using the popen() function (which is not
standard C++, but POSIX-standard)

class GNUplot {
public:
GNUplot() throw(string);
~GNUplot();
void operator ()(const string& command);
// send any command to gnuplot
protected:
FILE *gnuplotpipe;
};

GNUplot::GNUplot() throw(string) {
gnuplotpipe=popen("gnuplot","w");
if (!gnuplotpipe) {
throw("Gnuplot not found !");
}
}

GNUplot::~GNUplot() {
fprintf(gnuplotpipe,"exit\n");
pclose(gnuplotpipe);
}

void GNUplot::eek:perator() (const string& command) {
fprintf(gnuplotpipe,"%s\n",command.c_str());
fflush(gnuplotpipe);
// flush is necessary, nothing gets plotted else
};


You simply construct one object and invoke it with operator () like

GNUplot plotter;
plotter("plot sin(x)");

Note that GNUplot will be killed as soon as your program terminates. So
you need to wait for keystroke or similar, otherwise you will only see
short flashing of the graph. If you need that the graph window stays on
screen after your pragram fnished, then instead of "gnuplot" in the
constructor invoke "gnuplot -persist".
 
Joined
Feb 9, 2010
Messages
2
Reaction score
0
Movie from C++ program using gnuplot in UBUNTU.

My question looks likt the same bu a lil different.
My question is: I am running program in C++ that creates a data file which I can easily plot. Now I want to make a movie with the data. I want the program to call the gnuplot and start plotting date from the first run of the program. Is it possible to do that? If so how can I do that? What do I need to have in my program? I am working Linux environment in UBUNTU.
I would be happy if anybody can share your knowledge please.
Nagendra
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top