2011-09-12 3 views
0

나는 execve 명령을 통해 파일 설명자를 전달한 다음 다른 쪽에서 액세스 할 수 있는지 궁금합니다. 나는 filedescriptor를 리다이렉트하기 위해 dup2를 사용할 수는 있지만 그것을 할 수는 없다는 것을 알고있다. 실제로 파일 설명자를 자식에게 전달하고 자식에서 사용하는 것이 필요합니다. 에,패스 파일 설명자 - Execve (타입 변환)

close(pfd[1]); 
execve("./reader", args_1, NULL); 

다음 :

int pfd[2]; 
if(pipe(pfd) == -1) 
    exitWithError("PIPE FAILED", 1); 
char *args_1[] = {"reader", argv[1], (char*) pfd, (char *) 0}; 

그런 다음 아이가 원하면 execve 포크 후과 같이 호출

부모는과 같이 파이프 + 인수한다 : 내가 지금까지 가지고

리더 프로그램 통과 된 파이프 설명자에 액세스하려고합니다.

int main(int argc, char* argv[]){ 
    ... 
    write(argv[2][1], buf, read_test); 

^^ argv [2]는 파이프 디스크립터를 참조해야하며 [1]은 파이프의 쓰기 끝으로 가야합니다. 나는 여기서 약간 다른 타입 캐스팅을해야한다고 거의 긍정적이지만, 시도하는 모든 것이 잘 풀리지 않습니다.

- 참고 :이 프로그램의 작업 버전은 dup2를 사용하여 표준 입력과 표준 출력으로 리다이렉트하지만, 실제로 프로젝트의 지시에 따라 파이프 설명자를 자식에게 전달해야합니다.

도움을 주시면 감사하겠습니다.

답변

2

단순히 파일 설명자를 char*으로 캐스팅하는 것은 좋지 않습니다. OS가 문자열 복사를 선택하고 0 바이트에서 중지하면 데이터가 손실 될 수 있으므로 데이터가 완전히 복사되지 않습니다. 파일 설명자를 포함하는 문자열을 만드는 것이 더 안전합니다.

int pfd[2]; 
if(pipe(pfd) == -1) 
    exitWithError("PIPE FAILED", 1); 
char string1[12]; // A 32 bit number can't take more than 11 characters, + a terminating 0 
snprintf(string1,12,"%i",pfd[1]); // Copy the file descriptor into a string 
char *args_1[] = {"reader", argv[1], &string1[0], (char *) 0}; 

판독기 프로그램은 atoi을 사용하여이를 int로 변환합니다.


당신이 정말로 캐스트를 사용하려면

int fd = atoi(argv[2]); 
write(fd,buf,read_test); 

는, 당신은 당신의 독자에 int*argv[2] 캐스팅해야합니다.

write(((int*)argv[2])[1],buf,read_test); 
+0

고맙습니다. 나는 여전히 그 거래에서 실제로 일어났던 일에 대해 머리를 감싸려고 노력하고있다. (타입 캐스팅은 조금 혼란 스럽다.) 그러나 당신의 포스트는 분명하고 나는 이해한다고 생각한다. – forTruce