2014-09-16 12 views
-1

우분투 10에 프로세스를 만들고 프로세스 ID를 표시하고 프로세스를 종료하는 C 프로그램을 작성하고 있습니다. 사용자가 scanf를 통해 입력 한 프로세스 ID를 kill하려면 kill() 명령을 사용하고 있습니다. 그러나 scanf가 전혀 작동하지 않습니다. % d 앞에 "space"를 추가하려고했지만 아무 일도 일어나지 않았습니다. 누구든지 도울 수 있다면 감사하게 생각하십시오! 다음C 프로그래밍 - 우분투에서 작동하지 않는 Scanf

내 코드입니다 :

include <stdio.h> 
include <unistd.h> 
include <signal.h> 
include <sys/types.h> 
include <stdlib.h> 

main() 

{ 
    int x; 
    int pid[10]; // to store fork return value 
    int p[10]; // to store process ID 

    // Create 5 new processes and store its process ID 
    for (x=1;x<=5;x++) 

    { 
     if ((pid[x]=fork())==0) 

     { 
      p[x]=getpid(); 

      printf("\n I am process: %d, my process ID: %d\n",x,p[x]); // Display process number and PID 
     } 
     else 
      exit(0); 
    } 

    { 
     int y;  
     y=p[x]; 
     printf("Please enter a process ID to kill: "); 
     scanf(" %d", &y); //waiting for user input 
     printf("\nThe process %d is killed.\n",y); 
     kill(y,9); //Values 9 represents SIGKILL 

    } 

} 
+1

왜 당신이 그것을 테스트 할 수있는 간단하고 합리적인 프로그램을 작성하지 않습니다

같은 것을 당신이 가장 가능성이하고 싶은입니까? – HuStmpHrrr

+0

제목은 자기 자신의 코드를 제외하고 어디에서나 오류를 찾는 것을 제안합니다. –

답변

3

당신의 부모 프로세스가 종료, 그래서 당신이 이후에 산란 모든 프로세스가하는 (포크의 자신의 반환 값은 1 개 그래서 그들은 출구 다릅니다). 프로세스에 부모가없는 경우 "고아"가되며 OS에서 특수 처리됩니다 (다른 프로세스에서 채택 함). 당신이 찾고 있던 행동이 틀림 없습니까?

편집 :

#include <stdio.h> 
#include <unistd.h> 
#include <signal.h> 
#include <sys/types.h> 
#include <stdlib.h> 

int main() 
{ 
int x; 
int pid[10]; // to store fork return value 

pid_t parent = getpid(); 
// Create 5 new processes and store its process ID 
for (x=1;x<=5;x++) 

{ 
    if ((pid[x]=fork())!=0) 

    { 
     printf("\n I spawned process: %d, its process ID: %d\n",x,pid[x]); // Display process number and PID 
    }else{ 
      while(1){} 
    } 
} 

if(getpid() == parent){ 
    int y; 
    y=pid[x]; 
    printf("Please enter a process ID to kill: "); 
    scanf(" %d", &y); //waiting for user input 
    printf("\nThe process %d is killed.\n",y); 
    kill(y,9); //Values 9 represents SIGKILL 

}else{ 
    printf("THIS SHOULD NOT HAPPEN!"); 
} 
    return 0; 
} 
+0

예, 작동합니다. 도와 줘서 고마워! –

0

포크가 다른 프로세스에 두 번 할 때마다 반환 이것은 당신이 쓸 무슨 뜻인지 아마. 두 프로세스에 대해 알아야 할 중요한 점 중 하나는 메모리를 공유하지 않는다는 것입니다. 즉, 자식에서 getpid를 호출하고이를 배열에 저장하면 변수의 부모 사본에서 그 값을 볼 수 없습니다.

for (...) { 
    if ((pid[x]=fork()) == 0) { 
    printf("child created, pid = %d\n", getpid()); 
    while(1) sleep(1000); /* children will never run outside this loop */ 
    } else { 
    continue; 
    } 
} 
/* this code only runs in the parent */ 
+0

"부모 proc에서만"의미하는 바를 명확하게 설명해 주시겠습니까? 프로세스 ID와 프로세스 번호를 인쇄하려면 어떻게해야합니까? –

+0

물론, 아이들이 살해 될 때까지 아이들이 유휴 상태에 있기 때문에 실행은 부모 프로세스의 해당 지점에만 도달 할 수 있음을 의미합니다. 각 자식 프로세스가 자신의 PID를 분기 처리 할 때 그 PID를 나열하도록하거나, 충분한 자식을 생성했음을 확인한 후에 부모 프로세스가 모든 자식을 한 번에 나열하도록 할 수 있습니다. 내 대답에있는 코드를 편집하여 내가 의미하는 바를 정확히 보여줄 것입니다. –