pipe()와 fork()를 사용하여 데이터전송하는 프로그램인데요. 질

ksjsc의 이미지

안녕하세요.

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;
}
pynoos의 이미지

write를 할 때 전송되는 data가 가리키는 포인터는 한쪽 프로세스에서만 유효하지 그 포인터값이 그대로 전송되어 다른 프로세스로 이동되었을 경우에는 유효하지 않은 포인터값입니다.

이런 경우에는 배열을 써서 전송하여야합니다.

amister의 이미지

아웅. pynoos 님께서 좋은 답변 해주셔서 그냥 넘어가려했는데... 잘못된 코드를 보고 있자니 아침부터 기분이 묘해서. ^^;

헤더가 저렇게 되어있으면 안됩니다.

typedef struct {
   unsigned short int seq;
   char *data;
}header;

이 데이터는 2bytes의 seq와 4bytes의 char* - 주소값 - 를 나타냅니다. 받는 쪽에서 보내는 프로세스의 주소값을 받아봤자 아무 쓸모가 없죠. 따라서 원하시는 바를 이루고자 하려면 다음과 같이 헤더와 데이터를 분리해야 합니다.
typedef struct {
    unsigned short int seq;
} header;

typedef struct {
    char buf[10];
} data;

그리고 보내는 코드와 받는 코드는 대략 다음과 같이 되어야 합니다.
/* Sender */
header h;
data d;

// fill in header & data
...

write(fd, &h, sizeof(h));
write(fd, &d, sizeof(d));


/* Receiver */
header h;
data d;

read(fd, &h, sizeof(h));
read(fd, &d, sizeof(d));

마지막으로, 다음 코드에 대해서...

char *buffer = (char *)malloc(sizeof(10));

10bytes의 버퍼메모리를 할당하실 의도가 아니었나요? sizeof(10)은 sizeof(int)가 되고, 이는 x86같은 32bit system에서는 4라는 값이 됩니다. 따라서 이런 경우 malloc(sizeof(10)); 은 4bytes의 메모리만을 할당해주게 되죠. 만약 정말로 sizeof(int) 만큼만 할당할 의도였다면 sizeof(10) 대신에 sizeof(int)로 써주시는 것이 코드 가독성에 도움이 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.