2017-04-25 8 views
0

다음에 프로그램을 실행하면 주 기능 fork에서 2 개의 프로세스를 생성합니다. 자식 프로세스는 무언가를하고 부모 프로세스는 다시 fork되고 자식은 다른 함수를 호출합니다. 두 함수 모두 1 파일에 쓰고 모든 것이 잘 작동합니다. 내가 필요한 것은 파일의 끝에 무언가를 쓰는 것입니다. 두 함수와 모든 프로세스 (두 함수 모두 프로세스를 생성합니다)가 끝난 후에 말입니다. 나는 fprintf 명령을 어디에서나 main에 쓰려고 노력했다. 그리고 그것은 어쨌든 파일 중간에 어딘가에서 쓰려고했기 때문에 메인이 적절하게 2 개의 함수와 병렬로 실행된다고 생각한다. 나는 semaphore를 사용하려고 시도했다. s = sem_open(s1, o_CREATE, 0666, 0); 각 기능의 끝에서 나는 sem_post(s)을 썼고 메인에는 sem_wait(s); sem_wait(s);을 넣었다. 그리고 나서 fprintf 명령을 썼지 만 작동하지 않았다. 이 문제를 해결하는 방법이 있습니까? 감사합니다.내 프로그램에서 "fork 부분"

+0

'fork'를 사용하는 것은 병렬 처리가 아닙니다 * - 이것은 잘못된 용어입니다. – t0mm13b

답변

1

나는 wait 기능을 찾고 있다고 생각합니다. this stack overflow question : wait(NULL)을 참조하십시오. 모든 자식이 완료 될 때까지 대기 자식 프로세스가 완료되기를 기다립니다 (Jonathan Leffler). 반복적으로 wait으로 전화하면 모든 하위 프로세스가 완료 될 때까지 대기합니다. 상위 프로세스의 파일에 쓰기 바로 전에 해당 함수를 사용하십시오.

모든 프로세스 대신 특정 프로세스를 기다리고 싶다면 waitpid 기능에 대해서도 읽을 수 있습니다.

편집 : 또는 실제로 프로세스간에 세마포를 사용할 수 있지만 작업이 조금 더 필요합니다. this stack overflow answer을 참조하십시오. 기본적인 아이디어는 sem_open 함수를 O_CREAT 상수와 함께 사용하는 것입니다. sem_open man page에서

sem_t *sem_open(const char *name, int oflag);

sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);

: 당신의 부모 프로세스에서

If O_CREAT is specified in oflag, then two additional arguments must 
    be supplied. The mode argument specifies the permissions to be 
    placed on the new semaphore, as for open(2). (Symbolic definitions 
    for the permissions bits can be obtained by including <sys/stat.h>.) 
    The permissions settings are masked against the process umask. Both 
    read and write permission should be granted to each class of user 
    that will access the semaphore. The value argument specifies the 
    initial value for the new semaphore. If O_CREAT is specified, and a 
    semaphore with the given name already exists, then mode and value are 
    ignored. 

, 모드 및 값 매개 변수 sem_open 전화를 제공 sem_open 2 명 함수 서명을 가지고 필요한 권한. 자식 프로세스 (들)에서 사용하려면 해당 세마포를 열려면 sem_open("YOUR_SEMAPHORE_NAME", 0)을 호출하십시오.

+0

링크를 버리기보다는 각 답변의 내용을 간략하게 요약하는 데 도움이 될 수 있습니다. – t0mm13b

+0

감사합니다. – mgarey

+0

나는 잘 모르겠다. 그러나 나는 네가 쓰는대로 그것을 가지고 있다고 생각한다. 나는 그것을 가지고있다 : main : sem_t * s; s = sem_open (s1, O_CREAT, 0666, 0); sem_close (s); s = sem_open (s1, O_RDWR); 함수 1 및 2 : sem_t * s; s = sem_open (s1, O_RDWR); "s1"매크로입니다. – Erik