2014-11-11 2 views
-1

Возможно, ядро ​​этого вопроса было задано очень много на этом сайте.Получение pid, пытающегося остановить программу с помощью C

Я работаю с pocketsphinx, и я пытаюсь играть музыку каждый раз, когда я прошу об этом.

Когда я говорю «МУЗЫКА», программа исполняет музыку, моя идея в том, что когда я говорю «STOP», музыка должна останавливаться. Я пытаюсь получить PID следующим образом. Я получил эту идею от этого question

Я использую popen Я получаю PID, но не так, когда он добирается до pid_t pid = strtoul (строка, NULL, 10); это возвращает меня 0.

Как я могу получить этот PID и продолжить работу с программой одновременно?

Я использую один и тот же шаблон, который вы найдете на pocketsphinx хотите увидеть его с изменениями здесь: http://pastebin.com/Duu2nbCA

if(strcmp(word, "MUSIC") == 0) 
{ 
    FILE *fpipe; 
    char *command = (char *)"aplay BobMarley.wav"; 
    char line[256]; 

    if (!(fpipe = (FILE*)popen(command,"r"))) 
    { // If fpipe is NULL 
    perror("Problems with pipe"); 
    exit(1); 
    } 
    fgets(line, sizeof line, fpipe);     
    pid_t pid = strtoul(line, NULL, 10); 
    printf("The id is %d\n", pid); 

} 
+0

В вашем связанном вопросе принятый ответ выполняет «popen» на 'pidof'. Это не то, что вы делаете. Вам в основном нужно делать «popen» дважды, сначала на 'aplay', а затем на' pidof'. – DoxyLover

+0

@Diego Вы пытались выполнить свою программу с правами root? –

+0

@DoxyLover, как я могу получить pidof aplay? – Diego

ответ

1

Вы можете передать код, приведенный ниже, чтобы найти PID процесса. Выполнить с "root" разрешения

Аргумент к исполняемому файлу будет имя процесса, для которого ПИД-регулятор для полученного

#define TMP_FILE "/tmp/pid" 

int main(int argc, char** argv) 
{ 
    FILE *fpipe; 
    int pid = 0; 
    char command[50] = "pidof -s "; 

    if (argc != 2) { 
     printf("Invalid input\n"); 
     return -1; 
    } 

    strcat(command, argv[1]); 
    strcat(command, " > "TMP_FILE); 
    system(command); 

    fpipe = fopen(TMP_FILE, "r"); 
    fscanf(fpipe, "%d", &pid); 
    printf("The pid is %d\n", pid); 
    fclose(fpipe); 

    return 0; 
} 

На основе SIZEOF имени процесса варьировать длину команды.

Реализация 2

int main(int argc, char *argv[]) 
{ 

    FILE *fp; 
    char path[10]; 

    fp = popen("/sbin/pidof -s YOUR_APP", "r"); 
    if (fp == NULL) { 
     printf("Failed to run command\n"); 
     exit(1); 
    } 

    /* Read the output a line at a time - output it. */ 
    while (fgets(path, sizeof(path), fp) != NULL) { 
     printf("%s", path); 
    } 


    pclose(fp); 

    return 0; 
} 

Изменение YOUR_APP с именем приложения. Протестировано другими командами.

+0

Есть ли способ получить это, из-за необходимости писать на файл? Планирование голосового приложения распознавания, и я не считаю его очень хорошей оптимизацией. Позвольте мне проверить его и дать ему принятый ответ – Diego

+0

@Diego: Implemenatation 2 добавлено: оптимизировано –

+0

Спасибо! Я принял ваш ответ – Diego

Смежные вопросы