pipe()와 fork()를 사용하여 데이터전송하는 프로그램인데요. 질
글쓴이: ksjsc / 작성시간: 월, 2005/06/13 - 1:02오전
안녕하세요.
pipe()와 fork()를 사용하여 한쪽 프로세스에서 데이터를 전송하면
다른쪽 프로세스에서 이를 전송받아서 전송받은 내용을 출력하는
프로그램인데요. 실행이 잘 안되네요...ㅠㅠ
문제는 receiver에서 sender가 보낸 데이터를 전송받아서 seq의
내용을 출력하면 정상적으로 나오는데요. data의 내용을 출력하
면 나오질 않네요. 왜 이런 것인가요? 어떻게 하면 해결할 수 있을
까요? 고수님들의 답변 부탁드립니다.
#include<stdio.h> #include<unistd.h> #include<stdlib.h> typedef struct { unsigned short int seq; char *data; }header; void DataLinkSend(int fd) { header *Header = (header *)malloc(sizeof(header)); char *buffer = (char *)malloc(sizeof(10)); memset(buffer, '*', 10); Header->seq = 0x1234; Header->data = buffer; write(fd, Header, sizeof(header)); free(buffer); } void DataLinkRecv(int fd) { header *temp = (header *)malloc(sizeof(header)) ; read(fd, temp, sizeof(header)); printf("received seq : %x\n", temp->seq); printf("received data : %s\n", temp->data); } int main(int argc, char **argv) { int fd[2]; pid_t pid; pipe(fd); pid = fork(); if(pid == 0){ DataLinkSend(fd[1]); } else{ DataLinkRecv(fd[0]); } return 0; }
Forums:
write를 할 때 전송되는 data가 가리키는 포인터는 한쪽 프로세스에
write를 할 때 전송되는 data가 가리키는 포인터는 한쪽 프로세스에서만 유효하지 그 포인터값이 그대로 전송되어 다른 프로세스로 이동되었을 경우에는 유효하지 않은 포인터값입니다.
이런 경우에는 배열을 써서 전송하여야합니다.
---
http://coolengineer.com
아웅. pynoos 님께서 좋은 답변 해주셔서 그냥 넘어가려했는데...
아웅. pynoos 님께서 좋은 답변 해주셔서 그냥 넘어가려했는데... 잘못된 코드를 보고 있자니 아침부터 기분이 묘해서. ^^;
헤더가 저렇게 되어있으면 안됩니다.
이 데이터는 2bytes의 seq와 4bytes의 char* - 주소값 - 를 나타냅니다. 받는 쪽에서 보내는 프로세스의 주소값을 받아봤자 아무 쓸모가 없죠. 따라서 원하시는 바를 이루고자 하려면 다음과 같이 헤더와 데이터를 분리해야 합니다.
그리고 보내는 코드와 받는 코드는 대략 다음과 같이 되어야 합니다.
마지막으로, 다음 코드에 대해서...
10bytes의 버퍼메모리를 할당하실 의도가 아니었나요? sizeof(10)은 sizeof(int)가 되고, 이는 x86같은 32bit system에서는 4라는 값이 됩니다. 따라서 이런 경우 malloc(sizeof(10)); 은 4bytes의 메모리만을 할당해주게 되죠. 만약 정말로 sizeof(int) 만큼만 할당할 의도였다면 sizeof(10) 대신에 sizeof(int)로 써주시는 것이 코드 가독성에 도움이 됩니다.
댓글 달기