Хобрук: Ваш путь к мастерству в программировании

Запрос состояния процесса

У меня есть простая программа, и я запускаю exe и потом проверяю значение Exited, но это дает мне ошибку «паника: ошибка времени выполнения: недопустимый адрес памяти или разыменование нулевого указателя», есть идеи, почему?

package main

import (
    "fmt"
    "os/exec"
    "time"
)

func main() {
    prog:= exec.Command("path\to\exe")
    prog.Dir = "path\to"
    go prog.Run()
    fmt.Println(prog.ProcessState.Exited())
    time.Sleep(500 * time.Second)
}
15.07.2018

  • Размещенный код не компилируется. Возможно, вы хотели использовать / вместо \ в строковых литералах. 15.07.2018
  • \\ на самом деле, это в Windows. 15.07.2018

Ответы:


1

В документации говорится:

ProcessState содержит информацию о завершенном процессе, доступную после вызова Wait или Run.

Основная горутина получает доступ к полю ProcessState до того, как поле будет установлено в ненулевое значение вызовом Run() в горутине. В результате вызов Exited() вызывает панику.

Простое решение — вызвать Run() из основной горутины.

15.07.2018
  • Спасибо, это объяснимо. Если я правильно понимаю, ProcessState заполняется только после Exited процессов? Разве Exited() не будет всегда оцениваться как true? У меня есть приложение веб-сервера Gin (github.com/wys35/GoAPIserver), которое прослушивает 8080 и, следовательно, не вернется. Что я намерен сделать, так это запустить процесс как службу (github.com/kardianos/service/blob/master/example/runner/), что странно, находится в строке 98, она оценивается как true, даже когда я вижу, что мой exe-файл работает в диспетчере задач. Вы имеете представление об этом? 16.07.2018
  • В некоторых операционных системах Exited() возвращает значение true, только если процесс завершился нормально. Exited() возвращает false, если процесс был прерван сигналом и другим условием. Я не могу помочь с конкретными вопросами Windows, так как я не использовал Windows много лет. 16.07.2018
  • Все равно спасибо. 16.07.2018
  • Новые материалы

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..