2017-01-18 7 views
0
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include<signal.h> 
#include<unistd.h>//getch(); 
#include <termios.h>//getch(); 
#include <pthread.h> 
volatile sig_atomic_t flag = 0; 

char getch() 
{ 
    int buf=0; 
    struct termios old= {0}; 
    fflush(stdout); 
    if(tcgetattr(0, &old)<0) 
    perror("tcsetattr()"); 
    old.c_lflag&=~ICANON; 
    old.c_lflag&=~ECHO; 
    old.c_cc[VMIN]=1; 
    old.c_cc[VTIME]=0; 
    if(tcsetattr(0, TCSANOW, &old)<0) 
    perror("tcsetattr ICANON"); 
    if(read(0,&buf,1)<0) 
    perror("read()"); 
    old.c_lflag|=ICANON; 
    old.c_lflag|=ECHO; 
    if(tcsetattr(0, TCSADRAIN, &old)<0) 
    perror ("tcsetattr ~ICANON"); 
    //printf("%c\n",buf);//to print the value typed. 
    return buf; 
} 

void *send_function() 
{ 
    printf("\n Send Thread \n"); 
    //return 0; 
} 

void my_function(int sig) 
{ // can be called asynchronously 
    flag = 1; // set flag 
} 

int main() 
{ 
    char selection;//user input(s or r) 
    pthread_t send; 
    while(1) 
    { 
    signal(SIGINT, my_function); 
    //printf("\n Before SIGINT \n");    
    if(flag) 
    { 
     printf("\n Choose your terminal S or R \n"); 
     selection=getch(); 
     flag = 0; 
    } 
    if(selection=='s') 
     if(pthread_create(&send,NULL,send_function(),NULL)) 
     { 
     fprintf(stderr, "Error creating thread\n"); 
     return 1; 
     } 
    else if(selection=='r') 
     printf("Receive Function is received"); 
    //printf("\n After SIGINT \n"); 
} 
    return 0; 

} 

Выход:Почему моя простая программа pthreads врезается с ошибкой сегментации?

[email protected]:~/C_sample$ gcc -pthread -o thread thread.c 

[email protected]:~/C_sample$ ./thread 

Choose your terminal S or R 

Send Thread 

Send Thread 

Send Thread 

Send Thread 

Send Thread 
Segmentation fault (core dumped) 
[email protected]:~/C_sample$ ^C 
[email protected]:~/C_sample$ 

В приведенной выше программе я получаю ошибку сегментации. Мой требуемый вывод состоит в том, чтобы печатать "Send Thread" непрерывно, как только я нажимаю 's'. Я рассмотрел предыдущие подобные вопросы, но я не могу найти ответ. Может кто-нибудь мне помочь?

+0

http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Biffen

ответ

0

Вам необходимо изменить функцию send_function(). According to the man page, эта функция должна принимать указатель на void в качестве аргумента, и он должен возвращать указатель к мочеиспусканию:

void * send_function(void *parg) 
{ 
    printf("\n Send Thread \n"); 
    return parg; 
} 

Вы также должны исправить вызов функции, которая включает в себя пару паразитной скобки:

if(pthread_create(&send,NULL,send_function,NULL)) {} 

Как бы то ни было, ваша программа будет контурной печати "Send Thread", пока ваша система не исчерпает ресурсы. Вы можете создавать обособленные потоки, которые высвобождают ресурсы системы, когда они завершаются путем добавления этих строк до петли в main():

pthread_attr_t attr; 

if (pthread_attr_init(&attr) != 0) { 
    perror("Error in pthread_attr_init()"); 
    exit(EXIT_FAILURE); 
} 

if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0) { 
    perror("Error in pthread_attr_setdetachstate()"); 
    exit(EXIT_FAILURE);   
} 

Затем измените pthread_create() вызов внутри цикла, чтобы:

if(pthread_create(&send, &attr, send_function, NULL)) {} 

После этого изменить ваш программа должна печатать "Send Thread" несколько раз, освобождая ресурсы после каждого сообщения, пока вы не остановите его.

+0

Это был правильный вариант @ david.now он работает good.there не проблема сегментации. –

+0

после внесения изменений в код. После того, как я нажимаю клавишу ', он не работает бесконечно на протяжении всей программы. Он останавливается после нескольких циклов. Я не знаю, почему это происходит так. –

+0

@ NivasB-- вы, вероятно, хотите создать отдельные темы здесь. Я добавил немного об этом в свой ответ. –

1

Является ли эта линия:

if(pthread_create(&send,NULL,send_function(),NULL)) 

опечатка? Третий аргумент pthread_create - это указатель на функцию, в котором должен начинаться поток.

Должно быть:

if(pthread_create(&send,NULL,send_function,NULL)) 

Кроме того, потоки создания не будет действительно выход, если вы установите их атрибутов биты в отдельные, или явно отделить их, или собирать статус с pthread_join.

+1

Кроме того, 'send_function()' утверждает, что возвращает 'void *', но ничего не возвращает. – DyZ

+0

спасибо @mevets изменен –

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