Visit Our UNIX and Linux User Community


pipe help


 
Thread Tools Search this Thread
Top Forums Programming pipe help
# 1  
Old 02-21-2002
pipe help

i made a lot of processes. here is the code:

main()
{
printf("\nEnter K="); scanf("%d",&k);
printf("Enter L="); scanf("%d",&l);
printf("\nFather id=%d\n",getpid());
x=0;
makechild();
sleep(2);
return 1;
}
int makechild()
{
for(q=1;q<=k;q++)
{
if(f=fork())
{
}
else
{
printf("\nChild id=%d owner=%d\n",getpid(),getppid());
++x;
if(x<l) makechild();
sleep(1);
exit(0);
}
}
return;
}

it basically creates a tree of processes over L rows, each process having K sons.

now, my question is: how can i make these processes comunicate between them?
i figured i would need a lot of pipes but i can't seem to implement them and i'm getting sick with 'broken pipe' error.
can anyone give me some advice?
# 2  
Old 02-22-2002
Depends what kind of communication you need, and what the purpose of the program is. It is hard to answer the question based on the information provided. Some methods that can be used to communicate between processes:
  • write results to file, parent reads file
  • shared memory
  • network sockets
  • unix sockets


You may be interested in this link:
http://www.ecst.csuchico.edu/~beej/guide/ipc/


HTH
# 3  
Old 02-23-2002
Don't forget message queues and FIFO's Smilie

Another good link...
http://users.actcom.co.il/~choo/lupg...i-process.html
# 4  
Old 02-25-2002
Well, here is a quickie example of a pipe:
Code:
#include <stdio.h>   
#include <unistd.h>

void main()
{
        int pid, pipefd[2], parentpid, childpid;

        parentpid=getpid();
        pipe(pipefd);

        if (pid=fork()) {
                printf("I am the parent process and my pid is %d\n", getpid());
                printf("My child process has a pid of %d\n", pid);
                read(pipefd[0], (char *) &childpid, sizeof(childpid));
                printf("My child process sent me %d\n", childpid);
        } else {
                childpid=getpid();
                printf("I am the child and my pid is %d\n", childpid);
                write(pipefd[1], (char *) &childpid, sizeof(childpid));
                exit(0);
        }

        printf("I am still the parent process and my pid is %d\n", getpid());
        exit(0);
}

A broken pipe means that you are writing onto a pipe that has been closed by the other end.
# 5  
Old 02-26-2002
i was able to make a father and his son communicate through a pipe but the real problem is: in my example i have no control over when a process is created so i have no control over who is reading and/or writing to a pipe at a certain moment in time.
And i need to have some sort of control of that so i can send data from one process to it's sons and viceversa. How can i achieve that? I believe the most simple method would be using signals to tell the parent when a child is created so that the parent can start writing in the pipe and the child can read from it, but i'm totally lost here. Smilie
# 6  
Old 02-26-2002
Nothing that you're saying makes any sense at all.

A process has total control over when a child is created. When it invokes fork(), that is exactly when the process is created. The child exists when the very next statement is executed.

There is no need at all to synchonize the reading and writing on a pipe. The reader do can invoke read() hours before the data is written...it will simply wait unless it sets O_NDELAY in which case it returns immediately...so don't set that option. The reader can also read() hours after the write() on the other end. The data will wait. Neither case can cause a broken pipe, which is the error you complained about. That is caused by the reader exiting prior to the write.

Your real problem is that you'e trying to run a marathon when you can't yet walk.

If you attempt to use pipes in a full-duplex manner or use two pipe to achieve a two-way communication between processes, you will almost certainly cause deadlock. Get the data flowing in a single direction before you try to move on.

Previous Thread | Next Thread
Test Your Knowledge in Computers #501
Difficulty: Easy
If a piece of code adds two numbers together and stores the result, there should be a comment that explains the process in the source code.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to ignore Pipe in Pipe delimited file?

Hi guys, I need to know how i can ignore Pipe '|' if Pipe is coming as a column in Pipe delimited file for eg: file 1: xx|yy|"xyz|zzz"|zzz|12... using below awk command awk 'BEGIN {FS=OFS="|" } print $3 i would get xyz But i want as : xyz|zzz to consider as whole column... (13 Replies)
Discussion started by: rohit_shinez
13 Replies

2. Shell Programming and Scripting

How to use an input pipe ?

Hi all, I would like to use properly an input pipe, like this : cat myFile.txt | myCommand.shI always find this solution : while read line; do ...; donebut I have a great lost of performance ! On a big file, with a simple grep, I can spend 2400 times more time ! oO (from 0,023sec to 1m)... (4 Replies)
Discussion started by: LeNouveau
4 Replies

3. Programming

pipe() - Sincronization

Hi guys. I've a problem with pipes, I'm trying to make a program that can create a child process and they must generate the folowing output: Ping ... Pong Ping ... Pong Ping ... Pong I want syncronize the output whithout using the semephores, can anyone help me? Thanks in advance. /** *... (1 Reply)
Discussion started by: pharaoh
1 Replies

4. Shell Programming and Scripting

How do I use pipe in perl

I want to do the following in perl: print $output | grep ' something' | awk '{print $2}'; I know there is system(); but it does not behave the way I was expecting it in perl. (2 Replies)
Discussion started by: streetfighter2
2 Replies

5. Shell Programming and Scripting

Replace pipe with Broken Pipe

Hi All , Is there any way to replace the pipe ( | ) with the broken pipe (0xA6) in unix (1 Reply)
Discussion started by: saj
1 Replies

6. Shell Programming and Scripting

How can I use pipe

Hi, guys: I am working on my shell using c. How can I use pipe to implement the following? ls -l 1>> | grep hellp 1<< 2>> | less 2<< (the output of ls goes to grep, and the output of grep goes to less) Thanks Please use and tags when posting code, data or logs etc. to preserve... (1 Reply)
Discussion started by: tomlee
1 Replies

7. Programming

Pipe error

hi guys, o have a big error in this program but i cant solve someone ?! #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> int main(int argc, char *argv){ int cont = 2, posicao; char geraArquivo= "|cat>>", espaco=" "; char nomeArquivo, comando,... (11 Replies)
Discussion started by: beandj
11 Replies

8. UNIX for Dummies Questions & Answers

Broken Pipe

Hi I tried to open the man page of sh and piped to `pg`. Normally while reading a file page by page using `pg`, if we wanna quit at the middle of file, we give "q" near the colon mode. Ex1: $cat file1 | pg hi how r u : (page1) now press "return key", it will go to next page yes i ... (3 Replies)
Discussion started by: ramkrix
3 Replies

9. UNIX for Advanced & Expert Users

Broken Pipe

Hi I tried to open the man page of sh and piped to `pg`. Normally while reading a file page by page using `pg`, if we wanna quit at the middle of file, we give "q" near the colon mode. Ex1: $cat file1 | pg hi how r u : (page1) now press "return key", it will go to next page yes i ... (1 Reply)
Discussion started by: ramkrix
1 Replies

10. Shell Programming and Scripting

pipe | question

how do you pipe the results to next statement as argument? somecommand | grep $result somefile how do you reference $result with?? (12 Replies)
Discussion started by: convenientstore
12 Replies

Featured Tech Videos