2013-07-05 5 views
1

서버 또는 클라이언트 모드에서 실행할 수있는 단일 바이너리가 있습니다.동일한 바이너리, 동일한 파일의 다른 버전 실행

$ ./a.out --server & 
$ ./a.out --client & 

그들은 서로 대화하고, 이것은 잘 작동 :이처럼 사용할 수 있습니다. 내 질문은 내가 서버 시작할 때 예상되는 동작입니다 것입니다 :

$ ./a.out --server & 

을하지만 그때 나는 그것을 죽이고, 내 개발 작업, 편집 및 건물, 클라이언트 실행에 대한 이동하는 것을 잊지 :

$ edit client.c 
$ make 
$ ./a.out --client 
^C 
<repeat> 

스티키 비트가 설정되지 않은 상태에서 내 OS (Ubuntu)가 두 가지 버전의 바이너리를 실행합니까? 또는 바로 가기를 사용하고 메모리 내 인스턴스를 사용하고 있으므로 최신 빌드를 무시하고 있습니까? 이 실수에 다른 부작용이 있습니까?

답변

2

make은 원본 파일을 삭제하여 실행 파일을 대체합니다. 그러나 백그라운드에서 실행 중이므로 이에 대한 참조가 있습니다. 참조가 지워질 때까지 파일이 완전히 삭제되지는 않습니다 (새 실행 파일을 위해 디렉토리 항목이 지워지더라도).

따라서 예제에서는 두 가지 버전의 프로그램이 실행 중입니다. 하나의 부작용은 패킷 구조의 변경과 같이 클라이언트 코드가 일치하지 않는 큰 비 호환성을 서버에서 변경하는 경우입니다. 이상한, 설명 할 수없는 행동, 충돌 등을 보게 될 것입니다. 항상 백그라운드 서버를 죽이고 전체 테스트를 다시 실행하는 것이 좋습니다.

+0

감사합니다. 그것은 제가 두려워했던 것이고, 사실 보았습니다. –

1

서버 코드를 변경하지 않으면 a.out을 'my_server'로 복사하십시오. 예 : 그런 다음 my_server --server로 실행하십시오. make는 a.out을 대체하지만 my_server는 대체하지 않습니다.

다시 컴파일하기 직전에 실행중인 모든 a.out-s를 죽이려면 : a.out에 종속되고 'killall a.out'을 실행하는 target 'all'(makefile의 첫 번째 여야 함)을 추가하십시오. .

관련 문제