파이프를 이용하여 두 프로세스의 통신을 실현하다
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로 설정하면 난코드가 발생하는 이유이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
독서 노트문제1: 한 파일에 10000000개의 기록이 포함되어 있으며, 각 기록의 내용은 7자리의 정수이다.기록은 중복되지 않는다.파일 내용을 읽는 프로그램이 필요하고, 이 기록을 정렬한 후 파일을 출력해야 하며, 메모리는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.