Search Members Help

» Welcome Guest
[ Log In :: Register ]

Mini-ITX Boards Sale, Fanless BareBones Mini-ITX, Bootable 1G DSL USBs, 533MHz Fanless PC <-- SALE $200 each!
Get The Official Damn Small Linux Book. DSL Market , Great VPS hosting provided by Tektonic
Pages: (2) </ [1] 2 >/

[ Track this topic :: Email this topic :: Print this topic ]

reply to topic new topic new poll
Topic: pipe< Next Oldest | Next Newest >
smart girl Offline





Group: Members
Posts: 4
Joined: Mar. 2006
Posted: April 27 2006,23:32 QUOTE

hi all

I am trying to be much familier with pipes

I tried to write a c program that generates the following output


from child:
I
want
to
print
this
line
twice

from parent:
I
want
to
print
this
line
twice


what I get is


from child:
I
want
to
print
this
line
twice

from parent:
I
I
I
I
I
I
I

my code is

Code Sample

#include<stdio.h>
#include<string.h>

int main(void){
int childpid,fd[2],nb,i,j;
char line[BUFSIZ]="I want to print this line twice";
char word[BUFSIZ];


pipe(fd);

childpid=fork();

if(childpid==0)
{
printf("from child:\n");

close(fd[0]);

char *token=strtok(line," ");

while(token!=NULL)
{
printf(" %s\n",token);

write(fd[1],token,(strlen(token)+1));

token=strtok(NULL," ");

}

}

else
{

wait(NULL);
printf("from parent:\n");



close(fd[1]);

for( i=0;i<7;i++){
nb=read(fd[0],word,sizeof(word));
printf("%s\n",word);

}

}

return 0;

}


can any one tell me what's wronge with this code and how to correct it?
Back to top
Profile PM 
dtf Offline





Group: Members
Posts: 196
Joined: Nov. 2005
Posted: April 28 2006,03:54 QUOTE

If you don't mind me speculating a little.

I believe the problem is in the

nb=read(fd[0],word,sizeof(word));

You are thinking that you are reading one line incrementing the file pointer then reading a second etc.  But I think you are possibly reading in the entire message and what is in the word buffer is the entire phrase

I<null>want<null>to<null>print<null>this<null>line<null&g
t;twice<null>

and when you do the printf you alway print from the first word "I".

Try dumping the contents of the word buffer character by character to see what is in there after the first read.
Back to top
Profile PM 
smart girl Offline





Group: Members
Posts: 4
Joined: Mar. 2006
Posted: April 28 2006,10:49 QUOTE

Quote (dtf @ April 27 2006,23:54)
If you don't mind me speculating a little.

your kind response is greatly appreciated  


Quote


I believe the problem is in the

nb=read(fd[0],word,sizeof(word));

You are thinking that you are reading one line incrementing the file pointer then reading a second etc.  But I think you are possibly reading in the entire message and what is in the word buffer is the entire phrase

I<null>want<null>to<null>print<null>this<null>line<null&a
mp;g
t;twice<null>

and when you do the printf you alway print from the first word "I".



I didn't get what you means with that
Quote

Try dumping the contents of the word buffer character by character to see what is in there after the first read


do you mean I add this code after read?


Code Sample

for (k=0;k<strlen(word);k++)
printf("%c",word[k]);
Back to top
Profile PM 
dtf Offline





Group: Members
Posts: 196
Joined: Nov. 2005
Posted: April 28 2006,11:09 QUOTE

Whey you do the read

nb=read(fd[0],word,sizeof(word));

you are read the size of word which is BUFSIZ characters.  I do not know what  BUFSIZ is defined as but let say it is 1024.  The firts read (when i = 0) will read in all 1024 characters and not just the first line you wrote.  So after the first read your word buffer contains the entire phrase.  It could be that subsequent reads just fail because you are already at the end of the pipe.

Try checking the return rb to see how many characters are read as a test.  Like

printf("%d\n", rb);

This way you can tell how many characters are being read with each itteration of the for loop.

Yes I was suggesting adding code not fix you problem to debug it.  Once you understand the issue and have fixed it
you can remove the debug statements.  The code sample of dumping the buffer would work.
Back to top
Profile PM 
dtf Offline





Group: Members
Posts: 196
Joined: Nov. 2005
Posted: April 28 2006,11:15 QUOTE

Sorry but sometimes I drop letters and words when typing.  Let me try this sentence again.

Yes I was suggesting adding code not to fix your problem but to debug it.

and

The code sample for dumping the buffer will work.
Back to top
Profile PM 
6 replies since April 27 2006,23:32 < Next Oldest | Next Newest >

[ Track this topic :: Email this topic :: Print this topic ]

Pages: (2) </ [1] 2 >/
reply to topic new topic new poll
Quick Reply: pipe

Do you wish to enable your signature for this post?
Do you wish to enable emoticons for this post?
Track this topic
View All Emoticons
View iB Code