lyx_mirror/src/support/SystemcallPrivate.h
Scott Kostyshak 5225821242 Prevent zombie processes (#8774)
Using Systemcall::startscript() with Starttype::DontWait used to create
zombie processes, as nobody would collect them. This patch starts those
processes as detached, hence preventing them from becoming zombies.

In addition to #8774, this bug was also reported here:
https://bugs.launchpad.net/ubuntu/+source/lyx/+bug/1096666

Patch from Guy Rutenberg. For reference, see this email thread:
http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg180034.html
2013-07-16 01:02:28 -04:00

103 lines
2.0 KiB
C++

// -*- C++ -*-
/**
* \file SystemcallPrivate.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Enrico Forestieri
*
* Full author contact details are available in file CREDITS.
*/
#ifndef SYSTEMCALLPRIVATE_H
#define SYSTEMCALLPRIVATE_H
#include <QObject>
#include <QProcess>
#include <string>
namespace lyx {
namespace support {
class Systemcall;
/**
* Outputs to the console terminal the line buffered standard output and
* error of a spawned process when there is a controlling terminal and
* stdout/stderr have not been redirected.
*/
class SystemcallPrivate : public QObject
{
Q_OBJECT
public:
SystemcallPrivate(std::string const & infile, std::string const & outfile,
std::string const & errfile);
~SystemcallPrivate();
enum State {
Starting,
Running,
Finished,
Error
};
State state;
bool waitWhile(State, bool processEvents, int timeout = -1);
void startProcess(QString const & cmd, std::string const & path, bool detach);
int exitCode();
QString errorMessage() const;
QString exitStatusMessage() const;
QProcess* releaseProcess();
static void killProcess(QProcess * p);
public Q_SLOTS:
void stdOut();
void stdErr();
void processError(QProcess::ProcessError);
void processStarted();
void processFinished(int, QProcess::ExitStatus status);
private:
/// Pointer to the process to monitor.
QProcess * process_;
/// Index to the standard output buffer.
size_t out_index_;
/// Index to the standard error buffer.
size_t err_index_;
///
std::string in_file_;
///
std::string out_file_;
///
std::string err_file_;
/// Size of buffers.
static size_t const buffer_size_ = 200;
/// Standard output buffer.
char out_data_[buffer_size_];
/// Standard error buffer.
char err_data_[buffer_size_];
QString cmd_;
bool process_events_;
void waitAndProcessEvents();
void processEvents();
void killProcess();
};
} // namespace support
} // namespace lyx
#endif // SYSTEMCALLPRIVATE_H