2013-04-19 2 views
0

에 sigqueue와 함께 * 문자 보낼 수는 여기에 내가 다른 프로세스 여기

 union sigval toServer; 

     char *test = "dummy"; 
     serverPID = atol(buf2); 
     toServer.sival_ptr = (void *)test; 


     // Register to server 
     if (sigqueue(serverPID, SIGUSR1, toServer) == -1) { // register 
     fprintf(stderr," Server isn't ready!\n"); 
     return 1; 
     } 

내 오류가 없습니다

 static void register_handler(int signo, siginfo_t* info, void *context) { 

     registeredProgramID = info->si_pid; 

     if(info->si_value.sival_ptr != NULL) 
     fprintf(stderr," sent value is = %s \n" ,(char *)info->si_value.sival_ptr); 
     } 

서버 프로그램에서 핸들러하지만 난입니다 클라이언트 프로그램 내 코드의 일부이다 내가 보낸 것을 얻을 수 없다. 이상한 것을 인쇄합니다.

+0

서버 및 클라이언트 프로세스는 어떻게 작성합니까? – user2155932

+0

동일한 pc와 2 개의 터미널 gcc -c server.c gcc -o serv server.o ./serv 클라이언트와 동일 – noname

+3

프로세스 사이의 문자열에 포인터를 전달하고 있습니다. 문자열 데이터는 클라이언트의 주소 공간에 할당되며이 포인터는 서버의 주소 공간에서 유효하지 않습니다 (하나의 프로세스가 다른 프로세스에 의해'fork'를 사용하여 생성되는 경우, 그렇지 않을 수도 있습니다). 다른 IPC를 사용해야합니다. [this] (http://stackoverflow.com/questions/404604/comparing-unix-linux-ipc) 질문을 참조하십시오. – user2155932

답변

1

아니요.

char*을 보낼 수는 있지만 수신 프로세스는 일반적으로 일반적으로 보내는 프로세스의 메모리에 액세스 할 수 없으며 메모리가 다르게 매핑 될 수 있습니다. 수신 된 포인터가 가리키는 메모리 주소에 액세스하면 결과가 정의되지 않습니다 (즉 플랫폼에 따라 다르며 반드시 반복 가능하지는 않음). 가장 일반적인 결과는 일종의 메모리 보호 오류이거나 읽기 메모리에 임의의 값이 들어있는 경우입니다.