특정 프로세스에서 타 프로레스 실행시에 타이머나 알람이 동작하지 않습니다.

dunpeal의 이미지

안녕하세요.
그동안 검색으로만 보다가 도저히 풀리지 않는 문제가 있어서 오늘 가입해서 처음 글 올립니다.^^

A 와 B 두개의 프로세스가 있는데요.(B 는 A 에서 최초 실행)
서로 종료 된걸 캐치하면 system 함수로 재실행해주도록 처리되어있습니다.
둘 다 알람을 이용한 타이머 처리가 되어있는데,

A 에서 B 를 실행해주면 B 에 구현되어있는 알람이 잘 동작을 하는데
B 에서 A 를 실행해주면 A 의 알람이 등록은 되는데 동작하지 않습니다.

둘의 차이점이 뭔가해서 프로세스 정보를 찍어보니

A 는 Flag 값이 4이고
B 는 Flag 값이 0이어서 이부분이 의심이 갑니다.

그런데 왜 A 와 B 의 Flag 가 다른지 모르겠고,
B 의 Flag 를 4로 어떻게 바꿔야할지도 모르겠습니다.

둘의 파일권한이나 소유자는 동일하게 되어있는데요.

그럼 의견부탁드립니다.

twinwings의 이미지

질문이 너무 두리 뭉실해서 잘 모르겠습니다.
- B는 A 에서 최초 실행이 무슨 말인지 모르겠습니다. fork() 인가요?
- 종료된걸 캐치 한다니, SIG** 을 이용하는 건가요?

부모-자식관계는 당연히 비 대칭관계라서, wait() 군의 함수들은 "부모"가 "자식"을 기다리지 반대는 안됩니다.(아마도)

man wait wrote:

...
...

All of these system calls are used to wait for state changes in a child
of the calling process, and obtain information about the child whose
state has changed.

...
...


저라면 제 3의 프로세스 C에게 A,B를 등록하고,

C에서 감지하게 되면(파이프로 구현해서 파이프가 깨지면 호출되는 식으로. select()등으로 판별 가능하겠죠)

A,B를 다시 실행하도록 하겠습니다.

dunpeal의 이미지

fork() 는 아니구요.

B 가 제 3의 프로세스인데
A가 실행되고 나서 A 코드내에서 B 를 실행해줍니다.

B 에서 A 가 종료되었는지여부는 아래와같이 popen 으로 확인하고 있습니다.
popen("ps -ef|grep -w A |grep -v grep|awk '{print $2}'","r");

해당 값이 널이면 B 코드내에서 A 경로로 A 를 실행을 해줍니다.
이경우 A 의 타이머가 미동작합니다.

dunpeal의 이미지

B를 A 코드 내에서 실행하지 않고,
A 실행하듯이 .sh 파일내에서 A 실행할때 같이 B 도 실행해주니 문제는 해소가 되었습니다.

한가지 의문점은 여전히 남네요.
코드내에서 실행해준 프로세스에서 다른 프로세스를 실행시켜주면 타이머가 안도는 원인은 여전히 궁금하군요.