Вызов pppd в C-программе блокирует поток - PullRequest
0 голосов
/ 09 октября 2019

У меня есть скрипт, который я вызываю из программы на Си. Я делаю это перед тем, как запускать потоки, так как мне нужна ссылка ppp, прежде чем эти потоки начнутся. Я делаю следующее:

int main(){
    int ret = 0;
    ret = WEXITSTATUS(system("./nbiot_telit_ppp_installer.sh"));
    printf("ret = %d\r\n", ret);

    // Never gets here after ppp is up
    /* Start the threads */
    ==> starts thread-1
    ==> starts thread-2
}

Я пытался вызвать скрипт в потоке-1, как показано ниже:

void *thread1(void *thPtr)
{
    int ret = 0;
    ret = WEXITSTATUS(system("./nbiot_telit_ppp_installer.sh"));
    printf("ret = %d\r\n", ret);

    // Never gets here after ppp is up
    /* Some aws init code */

    while(1){
    }
} 

В случае успеха скрипта я получаю ниже:

  Script /etc/ppp/ip-up started (pid 7771)
  Script /etc/ppp/ip-up finished (pid 7771), status = 0x0

После вышеперечисленного код за его пределами или под ним не выполняется. Возвращается только если сценарий завершен.

Независимо от успешности или сбоя ppp-ссылки, я хотел бы получить значение «status» в моем коде c и принимать решения на его основе. У меня есть опыт работы на голом металле, но довольно новый для Linux. И было бы замечательно узнать мнение экспертов по этому вопросу и предложения о том, как этого добиться.

1 Ответ

0 голосов
/ 19 октября 2019

Когда появляется ppp links, он выполняет файл / etc / ppp / ip-up. Когда он выходит из строя, он выполняет / etc / ppp / ip-down. Если вы поместите что-то в эти файлы, вы можете использовать это как флаг.

Мой файл ip-up:

#!/bin/sh
echo ppp is up > /var/run/ppp-up-flag

Мой файл ip-down:

#!/bin/sh
rm /var/run/ppp-up-flag

Теперь моя программа может тестировать /var/run/ppp-up-flag.

Определить нить ppp link

...