2016-11-14 1 views
0

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

void killbyPIDprocess(struct process** ptr,char* p) 
{ 
    int i=0; 
    printf("hi"); 

while(ptr[i]!=NULL) 
{ 
    printf("Inside while loop"); 
    printf("%d\n",ptr[i]->pid); 
    printf("%d\n",*p); 
    if(strcmp(ptr[i]->pid,p)==0) 
    { 
     printf("Kill process of PID %d\n",p); 

    } 
    else 
    { 
     i++; 
    } 

} 
} 

В методе контура, мое состояние

void loop(char *input) 
{ 
bool flag=true; 
char **tokens; 
    struct process **ptr=(struct process*) malloc (BUFFERSIZE);//Is the array that contains pointers to all the processes created. 
int ci=0;int i=0; 

while(flag==true) 
{ 
    input=getInp(input); 
    tokens=tokenize(input); 
    if(strcasecmp(*tokens,"kill")==0) 
    { 
     strtok(tokens[1],"\n"); 
     char* pid=(char*)malloc (BUFFERSIZE); 
     pid=tokens[1]; 
     printf("%s",pid); 
     killbyPIDprocess(ptr, pid); 

    } 
    } 

Метод ввода только принимает данные от пользователя. Метод tokenize использует метод strtok для токенизации ввода. Если я вводим kill (PID), он переходит к методу killbyPIDprocess (ptr, pid), где ptr - это двойной указатель, содержащий все указатели структурных процессов. Я храню информацию о процессе, которую я создаю. Пид, который я печатаю в методе цикла, такой же, как и для ввода, который я ему даю, т.е. одного pid, с которым я хочу завершить свой процесс, но когда я передаю этот pid через метод killbyPIDprocess, он показывает другое значение. Я еще не начал работать над кодом kill, потому что он продолжал давать мне ошибки. Я использовал заявления печати, чтобы отслеживать, сколько из моего кода работает. Я относительно новичок в C и сам преподавал, поэтому, пожалуйста, указывайте на ошибки.

+0

И не имеет значения, использую ли я * p или p в killbyPIDprocess(). p показывает значение мусора – Sobiaa

ответ

1

напечатает цифровой код для первого символа в буфере, поэтому для получения тех же результатов вам необходимо использовать спецификатор формата %s - printf("%s\n", p);.

Этот код if(strcmp(ptr[i]->pid,p)==0) также неверен. process::pid член имеет тип pid_t, который является знаковым целым числом. Использование его в процедурах сравнения строк - это неопределенное поведение (не уверен, что он даже скомпилируется). Чтобы сравнить PID, вам необходимо преобразовать ваши строковые данные в целое число, используя, например, функцию atoi. Затем вы можете напрямую сравнить их с оператором ==.

+0

Спасибо. Итак, как мне сравнить pid_t со строкой? – Sobiaa

+0

@KeineLust Вы, конечно, правы. Обновлен ansver – Ari0nhh

+0

Thak you so much. atoi works: D – Sobiaa

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