2016-11-14 8 views
0

しかし、問題は、メソッドで送信する前に印刷するPIDと、メソッドで受け取った後に印刷するPIDが全く異なることです。これを理解できません。ループ法で私はPIDを使用してkillプロセスを作成しています

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は、structプロセスのすべてのポインタを含むダブルポインタです。私は1つを作成するプロセス情報を保存します。ループメソッドで印刷するpidは、入力したpidと同じです。つまり、処理を終了したいpidですが、このPIDをkillbyPIDprocessメソッドに渡すと、別の値が表示されます。私は実際に私がエラーを与え続けたので、まだキルコードに取り組み始めていません。私はprintステートメントを使って、コードのどれくらいが動作しているかを記録していました。私はCの方が比較的新しいので自己教えていますので、間違いを指摘してください。

+0

killbyPIDprocess()で* pまたはpを使用しても問題ありません。 pはゴミ値を示します – Sobiaa

答えて

1

printf("%d\n",*p);は、バッファ内の最初の文字の数値コードを出力するので、同じ結果を得るには%sフォーマット指定子-printf("%s\n", p);を使用する必要があります。

このコードif(strcmp(ptr[i]->pid,p)==0)も間違っています。 process::pidメンバには、符号付き整数であるpid_t型があります。文字列比較ルーチンでそれを使用することは、未定義の動作です(コンパイルされているかどうかはわかりません)。 PIDを比較するには、たとえばatoi関数を使用して、文字列データを整数に変換する必要があります。次に、直接演算子==と比較することができます。

+0

ありがとうございます。では、どうやってpid_tと文字列を比較するのですか? – Sobiaa

+0

@KeineLustあなたはもちろん正しいです。アンサーを更新しました。 – Ari0nhh

+0

atoi works:D – Sobiaa

関連する問題