2014-10-01 3 views
0

Прошу прощения за несколько двусмысленный заголовок, но я действительно не мог придумать более удобный способ его написать.Ошибка сегментации Cline getline (string) в отношении многопоточности

Я разрабатываю оболочку для класса, который, как предполагается, способен обрабатывать фоновые рисунки. Однако, поскольку оболочка не ждет дочерний процесс, когда фоновая настройка включена, я подумал, что было бы лучше создать второй поток, единственной целью которого является очистка дочернего процесса, когда он будет завершен. Теперь это отлично работает, пока не завершится дочерний процесс. Когда дочерний процесс завершается, следующий вход, который я вводил, дает мне ошибку сегментации. Используя gdb, я понял, что ошибка возникает из моей функции getline.

Я протестировал его, и std :: cin, похоже, не проблема. Кроме того, когда не фоновые, все работает отлично, никаких проблем вообще.

Для проверки фона я написал программу a.out, которая печатает, спит в течение десяти секунд, а затем печатает снова перед выходом. Выход:

/Users/opname/Shell Project>./a.out& 
/Users/opname/Shell Project>Sleep time! 
ls 
opshell a.out  pseudocode.c test.txt 
opshell.cpp a.out.dSYM shell.h  test2.txt 
opshell.dSYM gcctest.c sleeper.c testdir 
/Users/opname/Shell Project>Awake time! 
ls 
Segmentation fault: 11 

Вот код, где я раскошелиться процесс и создать новую тему:

  pid_t cpid = fork(); 
      if (cpid > 0) { 
       int status; 
       if (conc) { // if backgrounding enabled 
        pthread_t waiter; 
        struct tcpara *pm = (struct tcpara*) malloc(sizeof(struct tcpara)); 
        pm->cpid = cpid; 
        pm->status = &status; 
        pthread_create(&waiter, NULL, &thread_handler, (void*)pm); 
        pthread_detach(waiter); 
       } 
       else waitpid(cpid, &status, 0); 
       break; 

      } else if (cpid == 0) { 
       loc += cmd; 
       execv(loc.c_str(), argv); 
       _exit(0); 
      } 

И вот подпрограмма вызывается официанта нити:

void *thread_handler(void *pm) { 
    struct tcpara *ofpm = (struct tcpara*) pm; 
    waitpid(ofpm->cpid, ofpm->status, 0); 
    free(pm); 
    return NULL; 
} 

ответ

0

Try динамически распределяя динамическую переменную состояния. Когда поток должен использовать его, он больше не существует, потому что он вышел из сферы видимости. Я думаю, что это происходит с waiter. Вы можете попробовать сделать их статичными.

+0

Позор на меня. Большое спасибо. –

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