파이프를 이용하여 두 프로세스의 통신을 실현하다
2074 단어 운영 체제
#include
#include
#include
#include
#include
#include
#include
int main( )
{
pid_t pid1,pid2;
int pipe_fd[2];
char w_buffer[100],r_buffer[100];
int len1,len2;
/* */
if(pipe(pipe_fd)<0)
{
printf("pipe create error
");
return -1;
}
/* */
if((pid1=fork( ))==0) // 1
{
close(pipe_fd[0]); //
sprintf(w_buffer,"child 1 process is sending message!");
len1 = strlen(w_buffer);
write(pipe_fd[1],w_buffer,len1); /* len */
exit(0);
}
else if(pid1>0) //
{
waitpid(pid1,NULL,0); // 1-- 1
if((pid2=fork( ))==0) // 2
{
close(pipe_fd[0]); //
sprintf(w_buffer,"child 2 process is sending message!");
len2 = strlen(w_buffer);
write(pipe_fd[1],w_buffer,len2);
exit(0);
}
else if(pid2>0) //
{
waitpid(pid2,NULL,0); // 2-- 2
close(pipe_fd[1]); //
/* */
if(read(pipe_fd[0],r_buffer,sizeof(r_buffer))>0) // if(read(pipe_fd[0],r_buffer,len1)>0)
printf("%s
",r_buffer);
if(read(pipe_fd[0],r_buffer,sizeof(r_buffer))>0)
printf("%s
",r_buffer);
exit(0);
}
}
return 0;
}
// waitpid , , 。
// fork , 。
// 。
// ,“ P1 , P2 。”
// , ( )、 1 2 ( 1 , 2 )
문제: 출력 과정에서read 함수의 세 번째 인자를 50(write 함수의 세 번째 인자도 50으로 바꿀 때)으로 변경하면 정상적으로 실행할 수 있으며, ln1로 변경하면 하위 프로세스가 끝날 때 ln1이 차지하는 공간이 방출되어 값이 없습니다.
sizeof(r buffer)인 경우 정상적으로 작동할 수 있는 이유는 무엇입니까?만약sizeof 함수를 사용하지 않는다면 어떻게 수신자가 읽을 길이를 정확하게 식별할 수 있습니까?sizeof 함수를 사용할 때 테스트를 통해 sizeof(r buffer)의 값은 200인데 왜 세 번째 파라미터가 50이면 정상적으로 작동합니까?
해결됨: wbuffer 및 r버퍼는 모두 길이가 200인 문자 수조이기 때문에 수신할 때sizeof 함수를 사용하면 수용 내용을 정확하게 식별할 수 있다. 이것은 바로 세 번째 파라미터를 35로 설정하면 난코드가 발생하는 이유이다.