2017-11-05 7 views
0

저는 리눅스에서 코딩 중이며 다른 프로그램을 실행하여 어떤 작업을하려고합니다.C에서 execve 함수에 mmap을 전달하는 방법은 무엇입니까?

마스터는 일부 입력 파일 (슬레이브 당 1 파일)에서 일부 단어 검색을 수행하려면 슬레이브를 실행해야합니다. 모든 검색이 끝나면 마스터는 종속 프로세스에서 찾은 일치 행을 출력 파일에 씁니다. 공유 메모리를 사용하여 마스터와 슬레이브 간의 통신을 시도하고 있습니다.

마스터의 메인에있는 내 포인터를 다른 프로그램에 전달하고 거기에 가져와야하지만 그 유형이 일치하지 않기 때문에 연결할 수 없습니다.

동기화를 위해 세마포어를 사용하는 경우 공유 세마포의 mmap도 전달해야합니다. 노예를 실행하려면 발신자 main의 코드 스 니펫이 아래에 있습니다. 나는 노예의 주요의 변수는 argv를 사용하여 newArgv에 도달 할 수 있습니다 : 당신은 execve -ed 실행에 mmap를 전달할 수 없습니다

int f = open(argv[1], O_RDWR); 

unsigned int *addr = mmap(0, 10000, PROT_READ | PROT_WRITE, MAP_SHARED, f, 0); 

char * newArgv[10]; 
for (int a = 0; a < numberOfFiles; a++) { 
    newArgv[0] = wordToSearch; 
    newArgv[1] = argv[3 + a]; 
    char * path = "./psearch2aslave"; 
    execve(path, newArgv, NULL); 
} 
+1

포인터를 전달하지 마십시오 ... 어쨌든 동일한 포인터가 아닙니다. 적절한 OS 책을 읽고 IPC 장을 읽으면 익명의 mmap이 어떤 프로세스 사이의 IPC도 지원하지 않는다고 말해야합니다. 실제 파일을 mmap하고, 파일 이름을 전달하려고합니다. – HuStmpHrrr

+0

이름을 전달하면 mmap을 사용할 필요가 없습니다. 이것은 익명의 mmap이 아니며 ** 공유 메모리 **라는 이름입니다. –

+0

이름을 전달하는 것을 보지 못합니다. 너는 null을, 그러므로 익명으로 전달하고있다. – HuStmpHrrr

답변

2

.

execve이 성공하면 virtual address space 전체가 스크랩되고 실행 된 ELF 이진에 대해 다시 초기화됩니다. 이것이 execve(2)의 주요 역할 중 하나입니다. 시작시 프로그램은 잘 정의 된 메모리 상태를 기대해야합니다.

이름이 지정된 파일을 사용하는 것처럼 을 채택하고 해당 파일의 이름을 프로그램 인수로 전달할 수 있습니다.

(IIRC는, 누군가가 execve 전체의 지속적인 메모리 매핑에 대한 mmap(2)에 플래그를 추가 몇 년 전 커널 패치를 제안, 즉 패치가 좋은 이유와 함께, 거부, 나는 완전히 세부 사항을 잊어 매우 잘못 될 수)

아마도 당신은 shm_overview(7)을 원할 것입니다. 아니면 어떤 파일 이름으로 컨벤션을 채택하고 과 함께 mmap을 사용하십시오.

가상 메모리를 공유하더라도 몇 가지 동기화 수단이 필요합니다. sem_overview(7), futex(7), ....

도 읽으십시오. ALPOperating Systems: Three Easy Pieces (모두 무료로 다운로드 할 수 있음)을 읽어보십시오. syscalls(2)을 참조하십시오 (inter-process communication을 수행하는 여러 가지 방법이 있습니다).

관련 문제