2013-02-26 3 views
2

루프가 반복을 계속하고 가능한 경우 사용자로부터 입력을받는 것과 같은 기능을 구현하려고합니다. 다음 코드를 구현했지만 스캔 한 변수 "a"의 값이 인쇄 중에 반영되지 않습니다.C에서 비 블로킹 입력

pid_t pid; 
pid=fork(); 
if(pid == 0) 
{ 
    while(1) 
    { 
     printf("%d\n",a); 
     sleep(1); 
    } 
} 
else 
{ 
    while(1) 
    { 
     scanf("%d",&a); 
    } 
} 
+4

오, 이런 ... 한 프로세스에서 발생하는 일은 다른 프로세스의 변수에 영향을 줄 수 없습니다. 이 프로세스는 단일 프로세스 내의 스레드가 아니라 프로세스입니다. –

답변

2

fork() 할 때 프로그램의 공유 텍스트 영역을 사용하여 자식 프로세스가 만들어 지지만 만든 자식의 데이터와 스택 섹션은 부모와 다르기 때문에 자식은 항상 a = 1을 인쇄합니다.

3

이는 fork()를 사용하여 두 개의 별도 프로세스가 있기 때문입니다. 이 방법을 따르려면 스레드를 사용해야합니다.

0

이 경우 서로 다른 두 개의 프로세스가 생성되며 각 프로세스에는 자신의 a이 있습니다.

Linux pipes을 사용해야합니다.

0

fcntl()을 사용하여 stdin을 비 블로킹으로 표시 한 다음 루프에서 필요한 것을 수행하고 읽으려고하면 더 빠릅니다. 데이터가 없으면 실패하고 데이터를 사용할 수 없으면 실패합니다. 사용 가능한 경우 버퍼. 100 %의 CPU를 사용합니다. 데이터가 있는지 확인하려면 select()를 사용해야합니다.

0

공유 메모리를 사용할 수도 있지만 세마포어를 사용하여 공유 메모리 세그먼트에 대한 액세스를 동기화해야합니다.