2010-05-05 4 views
0

В приведенном ниже коде есть функция int GetTempString(char Query[]); , называя ее основными работами.Forked Функция не назначает указатель

Однако при вызове функции из вилки вилки виснет (не прекращает работу, без ошибок, не выход) до этой строки: pch = strtok (Query," ,");Printf показывает, что указатель на РСН является нулевым. Опять же это происходит только тогда, когда вилка выполняет его.

Что я делаю неправильно?

int main() 
{ 
if((Timer =fork())==-1) printf("Timer Fork Failed");  
    else if(Timer==0) 
    { 
     while(1) 
     {  
     sleep(2);  
     GetTempString("ch 1,2,3,4");   
     } 
    } 
    else 
    { 
     //CODE 

     GetTempString("ch 1,2,3,4"); 
     } 
} 

int GetTempString(char Query[]) 
{ 
     char * pch; 


    printf("DEBUG: '%s'-'%d'\n",Query,pch); 

    pch = strtok (Query," ,");//* PROBLEM HERE* 

     //while loop for strtok... 

     return 1; 

} 

ответ

2

strtok изменяет строку, на которую указывает первый аргумент (заменяя символы разделителя на NUL), но вы передаете строковый литерал, который неявно const. Вам нужно скопировать строку в буфер для записи до вызова strtok.

В вашем примере это происходит в обоих процессах, поэтому оба будут разбиваться. При публикации сокращенного примера, чтобы продемонстрировать проблему, обязательно сначала скомпилируйте и протестируйте его, чтобы убедиться, что он действительно показывает проблему, с которой вы столкнулись, а не какую-то совершенно не связанную проблему (что может быть здесь).

+0

Точка отмечена, спасибо –

0

Ваша функция возвращает локальную переменную, поэтому у вас есть неопределенное поведение - после этого все может произойти. Вам нужно выделить строку, которую вы возвращаете динамически, используя malloc() или передать ее функции в качестве параметра.

+0

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

0

Переменная TempString выделяется в стеке функции GetTempString. Использование этой переменной дает смысл только в контексте GetTempString. Используйте статический TempString [50], чтобы решить эту проблему.

+0

местный был удален, поведение все тот же –

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