Тупик на попен - PullRequest
       17

Тупик на попен

4 голосов
/ 29 июля 2011

Я пишу небольшое приложение под Linux (встроенное в ARM), которое запускает два потока.Я делаю «popen» в функции, и это создает тупик для второго потока, который входит в функцию.Однако первый поток, который первым вошел в функцию, по-прежнему работает правильно.

Вот пример кода:

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

    int sendCommand(
        const std::string& command, std::string& answer)
    {
      FILE* fd;                           // File descriptor to command output
      char answer_c[COMMAND_BUFFER_SIZE]; // The answer as char[]
      int answerLength = 0;               // The length of the answer

      pthread_mutex_lock( &mutex1 );

      // A probe
      cout << "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV" << endl;

      fd = popen(command.c_str(), "r"); // <- Second thread entering is stuck here ...
      if(fd <= 0)
      {
        cout << "couldn't popoen !" << endl;
        return -1;
      }

      // A probe, never showed by second thread entering the function
      cout << "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZzz" << endl;

      // ... Omitted code ...
      // Close the file descriptor
      pclose(fd);
      pthread_mutex_unlock( &mutex1 );

    }

У меня действительно есть чувство, что я упускаю что-то важное.Как мог тупик случиться с popen?Проблема исходит от стандартного ядра libc или Linux?

Любой указатель настоятельно рекомендуется!

С уважением,

1 Ответ

2 голосов
/ 29 июля 2011

Поскольку popen выполняет разветвление (которое не является потокобезопасным), то popen также не является потокобезопасным.

Этот вопрос и ответы могут вам немного помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...