2017-02-10 15 views
1

У меня есть программа командной строки, где я хочу разрешить пользователю печатать текущее время с помощью отдельного потока. В настоящее время у меня он настроен следующим образом:Создайте pthread, который печатает текущее время в командной строке

Я получаю пользовательский ввод, а затем сравниваю его со строкой time. Если они равны, я создаю новый поток, который устанавливает переменную времени.

char currentTime[20]; 
if (strcmp(input, "time") == 0) { 
    pthread_t thread; 
    int rc = pthread_create(&thread, NULL, getTime, NULL); 
    if (rc) { 
      printf("ERROR; return code from pthread_create() is %d\n", rc); 
      exit(-1); 
    } 
} 

Моя getTime функция:

void getTime() { 
    time_t rawtime; 
    struct tm * timeinfo; 
    time (&rawtime); 
    timeinfo = localtime (&rawtime); 
    sprintf(currentTime,"%s", asctime (timeinfo)); 
    printf("%s", currentTime); 
    pthread_exit(NULL); 
} 

Я получаю ошибку Abort trap 6 от этого, но я не получаю никаких ошибок от PTHREAD, так что я не уверен, что проблема есть. Кажется, что поток создается правильно.

+0

Вы действительно что-то читаете в 'input'? 'void getTime() {' должно быть 'void * getTime (void * arg) {' как требуется 'pthread_create()', даже если вам не нужно передавать какие-либо аргументы в поток. –

+0

Функция 'pthread' имеет подпись:' void * getTime (void * arg) ', поэтому первое, что вам нужно сделать, это правильно выполнить функцию' getTime() '. – user3629249

ответ

1

getTime() функция ничего не возвращает.

currentTime буфер слишком короткий.

Попробуйте это:

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

static void * getTime(void * arg) { 
    time_t rawtime; 
    struct tm * timeinfo; 
    time (&rawtime); 
    timeinfo = localtime (&rawtime); 
    printf("%s", asctime (timeinfo)); 
    return NULL; 
} 

int main(int argc, char * argv[]) { 
    pthread_t thread; 
    int  rc = pthread_create(&thread, NULL, getTime, NULL); 
    if (rc) { 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
    } 
    sleep(1); 
    return 0; 
} 

Compile и выполнить его:

$ gcc -Wall -o timeThread timeThread.c -lpthread 
$ ./timeThread 
Fri Feb 10 19:55:06 2017 
$ 

время является 25 символов длиной.

Обратите внимание на инструкцию sleep(1), чтобы ждать выполнения потока.