⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qprocess_unix.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            QString item = environment.at(j);            envp[j] = ::strdup(item.toLocal8Bit().constData());        }        if (!encodedProgramName.contains("/")) {            char *path = ::getenv("PATH");            if (path) {                QStringList pathEntries = QString(path).split(":");                for (int k = 0; k < pathEntries.size(); ++k) {                    QByteArray tmp = QFile::encodeName(pathEntries.at(k));                    if (!tmp.endsWith('/')) tmp += '/';                    tmp += encodedProgramName;                    argv[0] = tmp.data();#if defined (QPROCESS_DEBUG)                    fprintf(stderr, "QProcessPrivate::execChild() searching / starting %s\n", argv[0]);#endif                    ::execve(argv[0], argv, envp);                }            }        } else {#if defined (QPROCESS_DEBUG)            fprintf(stderr, "QProcessPrivate::execChild() starting %s\n", argv[0]);#endif            ::execve(argv[0], argv, envp);        }    }    // notify failure#if defined (QPROCESS_DEBUG)    fprintf(stderr, "QProcessPrivate::execChild() failed, notifying parent process\n");#endif    ::write(childStartedPipe[1], "", 1);    ::close(childStartedPipe[1]);    childStartedPipe[1] = -1;}bool QProcessPrivate::processStarted(){    char c;    int i = ::read(childStartedPipe[0], &c, 1);    if (startupSocketNotifier) {        startupSocketNotifier->setEnabled(false);        delete startupSocketNotifier;        startupSocketNotifier = 0;    }    ::close(childStartedPipe[0]);    childStartedPipe[0] = -1;#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::processStarted() == %s", i <= 0 ? "true" : "false");#endif    return i <= 0;}qint64 QProcessPrivate::bytesAvailableFromStdout() const{    size_t nbytes = 0;    qint64 available = 0;    if (::ioctl(standardReadPipe[0], FIONREAD, (char *) &nbytes) >= 0)        available = (qint64) *((int *) &nbytes);#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::bytesAvailableFromStdout() == %lld", available);#endif    return available;}qint64 QProcessPrivate::bytesAvailableFromStderr() const{    size_t nbytes = 0;    qint64 available = 0;    if (::ioctl(errorReadPipe[0], FIONREAD, (char *) &nbytes) >= 0)        available = (qint64) *((int *) &nbytes);#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::bytesAvailableFromStderr() == %lld", available);#endif    return available;}qint64 QProcessPrivate::readFromStdout(char *data, qint64 maxlen){    qint64 bytesRead = qint64(::read(standardReadPipe[0], data, maxlen));#if defined QPROCESS_DEBUG    qDebug("QProcessPrivate::readFromStdout(%p \"%s\", %lld) == %lld",           data, qt_prettyDebug(data, bytesRead, 16).constData(), maxlen, bytesRead);#endif    return bytesRead;}qint64 QProcessPrivate::readFromStderr(char *data, qint64 maxlen){    qint64 bytesRead = qint64(::read(errorReadPipe[0], data, maxlen));#if defined QPROCESS_DEBUG    qDebug("QProcessPrivate::readFromStderr(%p \"%s\", %lld) == %lld",           data, qt_prettyDebug(data, bytesRead, 16).constData(), maxlen, bytesRead);#endif    return bytesRead;}static void qt_ignore_sigpipe(){    // Set to ignore SIGPIPE once only.    static QBasicAtomic atom = Q_ATOMIC_INIT(0);    if (atom.testAndSet(0, 1)) {        struct sigaction noaction;        memset(&noaction, 0, sizeof(noaction));        noaction.sa_handler = SIG_IGN;        ::sigaction(SIGPIPE, &noaction, 0);    }}qint64 QProcessPrivate::writeToStdin(const char *data, qint64 maxlen){    qt_ignore_sigpipe();    qint64 written = qint64(::write(writePipe[1], data, maxlen));#if defined QPROCESS_DEBUG    qDebug("QProcessPrivate::writeToStdin(%p \"%s\", %lld) == %lld",           data, qt_prettyDebug(data, maxlen, 16).constData(), maxlen, written);#endif    return written;}void QProcessPrivate::terminateProcess(){#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::killProcess()");#endif    if (pid)        ::kill(pid_t(pid), SIGTERM);}void QProcessPrivate::killProcess(){#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::killProcess()");#endif    if (pid)        ::kill(pid_t(pid), SIGKILL);}static int qt_native_select(fd_set *fdread, fd_set *fdwrite, int timeout){    struct timeval tv;    tv.tv_sec = timeout / 1000;    tv.tv_usec = (timeout % 1000) * 1000;    int ret;    do {        ret = select(FD_SETSIZE, fdread, fdwrite, 0, timeout < 0 ? 0 : &tv);    } while (ret < 0 && (errno == EINTR));    return ret;}/*   Returns the difference between msecs and elapsed. If msecs is -1,   however, -1 is returned.*/static int qt_timeout_value(int msecs, int elapsed){    if (msecs == -1)        return -1;    int timeout = msecs - elapsed;    return timeout < 0 ? 0 : timeout;}bool QProcessPrivate::waitForStarted(int msecs){    Q_Q(QProcess);#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::waitForStarted(%d) waiting for child to start (fd = %d)", msecs,	   childStartedPipe[0]);#endif    fd_set fds;    FD_ZERO(&fds);    FD_SET(childStartedPipe[0], &fds);    int ret;    do {        ret = qt_native_select(&fds, 0, msecs);    } while (ret < 0 && errno == EINTR);    if (ret == 0) {        processError = QProcess::Timedout;        q->setErrorString(QT_TRANSLATE_NOOP(QProcess, "Process operation timed out"));#if defined (QPROCESS_DEBUG)        qDebug("QProcessPrivate::waitForStarted(%d) == false (timed out)", msecs);#endif        return false;    }    bool startedEmitted = _q_startupNotification();#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::waitForStarted() == %s", startedEmitted ? "true" : "false");#endif    return startedEmitted;}bool QProcessPrivate::waitForReadyRead(int msecs){    Q_Q(QProcess);#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::waitForReadyRead(%d)", msecs);#endif    QTime stopWatch;    stopWatch.start();    forever {        fd_set fdread;        fd_set fdwrite;        FD_ZERO(&fdread);        FD_ZERO(&fdwrite);        if (processState == QProcess::Starting)            FD_SET(childStartedPipe[0], &fdread);        if (standardReadPipe[0] != -1)            FD_SET(standardReadPipe[0], &fdread);        if (errorReadPipe[0] != -1)            FD_SET(errorReadPipe[0], &fdread);        FD_SET(deathPipe[0], &fdread);        if (!writeBuffer.isEmpty() && writePipe[1] != -1)            FD_SET(writePipe[1], &fdwrite);        int timeout = qt_timeout_value(msecs, stopWatch.elapsed());        int ret = qt_native_select(&fdread, &fdwrite, timeout);        if (ret < 0) {            if (errno == EINTR)                continue;            break;        }        if (ret == 0) {            processError = QProcess::Timedout;            q->setErrorString(QT_TRANSLATE_NOOP(QProcess, "Process operation timed out"));	    return false;	}	if (childStartedPipe[0] != -1 && FD_ISSET(childStartedPipe[0], &fdread)) {            if (!_q_startupNotification())                return false;	}        bool readyReadEmitted = false;	if (standardReadPipe[0] != -1 && FD_ISSET(standardReadPipe[0], &fdread)) {	    bool canRead = _q_canReadStandardOutput();            if (processChannel == QProcess::StandardOutput && canRead)                readyReadEmitted = true;	}	if (errorReadPipe[0] != -1 && FD_ISSET(errorReadPipe[0], &fdread)) {	    bool canRead = _q_canReadStandardError();            if (processChannel == QProcess::StandardError && canRead)                readyReadEmitted = true;	}        if (readyReadEmitted)            return true;	if (writePipe[1] != -1 && FD_ISSET(writePipe[1], &fdwrite))	    _q_canWrite();	if (FD_ISSET(deathPipe[0], &fdread)) {            if (_q_processDied())                return false;        }    }    return false;}bool QProcessPrivate::waitForBytesWritten(int msecs){    Q_Q(QProcess);#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::waitForBytesWritten(%d)", msecs);#endif    QTime stopWatch;    stopWatch.start();    while (!writeBuffer.isEmpty()) {        fd_set fdread;        fd_set fdwrite;        FD_ZERO(&fdread);        FD_ZERO(&fdwrite);        if (processState == QProcess::Starting)            FD_SET(childStartedPipe[0], &fdread);        if (standardReadPipe[0] != -1)            FD_SET(standardReadPipe[0], &fdread);        if (errorReadPipe[0] != -1)            FD_SET(errorReadPipe[0], &fdread);        FD_SET(deathPipe[0], &fdread);        if (!writeBuffer.isEmpty() && writePipe[1] != -1)            FD_SET(writePipe[1], &fdwrite);	int timeout = qt_timeout_value(msecs, stopWatch.elapsed());	int ret = qt_native_select(&fdread, &fdwrite, timeout);        if (ret < 0) {            if (errno == EINTR)                continue;            break;        }        if (ret == 0) {	    processError = QProcess::Timedout;	    q->setErrorString(QT_TRANSLATE_NOOP(QProcess, "Process operation timed out"));	    return false;	}	if (childStartedPipe[0] != -1 && FD_ISSET(childStartedPipe[0], &fdread)) {	    if (!_q_startupNotification())		return false;	}	if (writePipe[1] != -1 && FD_ISSET(writePipe[1], &fdwrite))	    return _q_canWrite();	if (standardReadPipe[0] != -1 && FD_ISSET(standardReadPipe[0], &fdread))	    _q_canReadStandardOutput();	if (errorReadPipe[0] != -1 && FD_ISSET(errorReadPipe[0], &fdread))	    _q_canReadStandardError();	if (FD_ISSET(deathPipe[0], &fdread)) {            if (_q_processDied())                return false;        }    }    return false;}bool QProcessPrivate::waitForFinished(int msecs){    Q_Q(QProcess);#if defined (QPROCESS_DEBUG)    qDebug("QProcessPrivate::waitForFinished(%d)", msecs);#endif    QTime stopWatch;    stopWatch.start();    forever {        fd_set fdread;        fd_set fdwrite;        FD_ZERO(&fdread);        FD_ZERO(&fdwrite);        if (processState == QProcess::Starting)            FD_SET(childStartedPipe[0], &fdread);        if (standardReadPipe[0] != -1)            FD_SET(standardReadPipe[0], &fdread);        if (errorReadPipe[0] != -1)            FD_SET(errorReadPipe[0], &fdread);        if (processState == QProcess::Running)            FD_SET(deathPipe[0], &fdread);        if (!writeBuffer.isEmpty() && writePipe[1] != -1)            FD_SET(writePipe[1], &fdwrite);	int timeout = qt_timeout_value(msecs, stopWatch.elapsed());	int ret = qt_native_select(&fdread, &fdwrite, timeout);        if (ret < 0) {            if (errno == EINTR)                continue;            break;        }	if (ret == 0) {	    processError = QProcess::Timedout;	    q->setErrorString(QT_TRANSLATE_NOOP(QProcess, "Process operation timed out"));	    return false;	}	if (childStartedPipe[0] != -1 && FD_ISSET(childStartedPipe[0], &fdread)) {	    if (!_q_startupNotification())		return false;	}	if (writePipe[1] != -1 && FD_ISSET(writePipe[1], &fdwrite))	    _q_canWrite();	if (standardReadPipe[0] != -1 && FD_ISSET(standardReadPipe[0], &fdread))	    _q_canReadStandardOutput();	if (errorReadPipe[0] != -1 && FD_ISSET(errorReadPipe[0], &fdread))	    _q_canReadStandardError();	if (FD_ISSET(deathPipe[0], &fdread)) {            if (_q_processDied())                return true;	}    }    return false;}bool QProcessPrivate::waitForWrite(int msecs){    fd_set fdwrite;    FD_ZERO(&fdwrite);    FD_SET(writePipe[1], &fdwrite);    int ret;    do {        ret = qt_native_select(0, &fdwrite, msecs < 0 ? 0 : msecs) == 1;    } while (ret < 0 && errno == EINTR);    return ret == 1;}void QProcessPrivate::findExitCode(){    Q_Q(QProcess);    processManager()->remove(q);}bool QProcessPrivate::waitForDeadChild(){    Q_Q(QProcess);        // read a byte from the death pipe    char c;    ::read(deathPipe[0], &c, 1);        // check if our process is dead    int exitStatus;    pid_t waitResult = waitpid(pid_t(pid), &exitStatus, WNOHANG);    if (waitResult > 0) {        processManager()->remove(q);        crashed = !WIFEXITED(exitStatus);        exitCode = WEXITSTATUS(exitStatus);#if defined QPROCESS_DEBUG        qDebug() << "QProcessPrivate::waitForDeadChild() dead with exitCode"                 << exitCode << ", crashed?" << crashed;#endif        return true;    }#if defined QPROCESS_DEBUG    qDebug() << "QProcessPrivate::waitForDeadChild() not dead!";#endif    return false;}void QProcessPrivate::_q_notified(){}/*! \internal */bool QProcessPrivate::startDetached(const QString &program, const QStringList &arguments){    processManager()->start();    pid_t childPid = fork();    if (childPid == 0) {        ::setsid();        ::signal(SIGHUP, SIG_IGN);        if (fork() == 0) {            char **argv = new char *[arguments.size() + 2];            for (int i = 0; i < arguments.size(); ++i)                argv[i + 1] = ::strdup(arguments.at(i).toLocal8Bit().constData());            argv[arguments.size() + 1] = 0;            if (!program.contains("/")) {                char *path = ::getenv("PATH");                if (path) {                    QStringList pathEntries = QString(path).split(":");                    for (int k = 0; k < pathEntries.size(); ++k) {                        QByteArray tmp = QFile::encodeName(pathEntries.at(k));                        if (!tmp.endsWith('/')) tmp += '/';                        tmp += QFile::encodeName(program);                        argv[0] = tmp.data();                        ::execv(argv[0], argv);                    }                }            } else {                QByteArray tmp = QFile::encodeName(program);                argv[0] = tmp.data();                ::execv(argv[0], argv);            }            ::_exit(1);        }        ::chdir("/");        ::_exit(1);    }    int result;    return (waitpid(childPid, &result, 0) && WIFEXITED(result));}void QProcessPrivate::initializeProcessManager(){    (void) processManager();}#include "qprocess_unix.moc"#endif // QT_NO_PROCESS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -