Father & children


 
Thread Tools Search this Thread
Top Forums Programming Father & children
# 1  
Old 01-30-2006
Father & children

Hello, i should finished this program, if anyone could tell me whats wrong... This is an optional university work, though i cant leave this nearly finished. I need to see where is my error Smilie

What my program should do.
The user must type "num_proc" ( number of children). The program creates a ring of num_proc processes with num_proc pipes, although i only use one variable ("tubo2") to access pipes.father and children will change the content of "frase" twice.


Code:
int main(int argc, char* argv[])
{
        int tubo1[2], tubo2[2], i,num_proc=0,numero=0,longitud=0,pid=0;
        char frase[MAXNAME];
      
        ...

        pipe(tubo1);

        dup2(tubo1[0],tubo2[0]);
        dup2(tubo1[1],tubo2[1]);

        close(tubo1[0]);
        close(tubo1[1]);


        /* Creating num_proc number of processes */

        for( i=0; i<num_proc; i++)
        {
                pipe(tubo1);

                if ( (pid=fork()) == -1 )
                        printf("\nError. Fork\n\n");
                else
                {
                        if ( pid )
                        {
                                /* Fatherīs code */

                                dup2(tubo1[0],tubo2[0]);
                                close(tubo1[0]);
                                close(tubo1[1]);
                        }
                        else
                        {
                                dup2(tubo1[1],tubo2[1]);
                                close(tubo1[0]);
                                close(tubo1[1]);
                                break;
                        }
                }
        }


        if ( pid )
        {
                /* Father */

                for (i=0; i<2; i++)
                {
                        /* "frase" modification. Father starts. */

                        write(tubo2[1], frase, longitud*sizeof(char));
                        read(tubo2[0], frase, longitud*sizeof(char));
                }
        }
        else
        {
                /* Children code */
                for (i=0; i<2; i++)
                {
                        read(tubo2[0], frase, MAXNAME*sizeof(char))
                        /* "frase" modification */
                        write(tubo2[1], frase, longitud*sizeof(char));
                }
        }

 return 0;
}


Last edited by Perderabo; 01-30-2006 at 02:13 PM.. Reason: Add code tags for readability
# 2  
Old 01-30-2006
Rules violation
Posting of assignments on the forum is not allowed.

However, you seem to have taken some efforts on your assignment.
I have a piece of question here

you do a
close(tubo1[0]);
close(tubo1[1]);

and then you do a pipe(tubo1);

anyway can you explain what exactly is the issue, do you get some program errors, compile time, run time or the program is running but not as expected ?
# 3  
Old 01-30-2006
I guess I'll leave this thread open for now. Maybe someone will close it though. Anyway please review the rules.

I can't guess what the program is supposed to do. But unix is byte oriented. Multiplying the third parameter of read() and write() by sizeof(char) is almost always wrong. This is very dangerous:
char frase[MAXNAME];
read(tubo2[0], frase, MAXNAME*sizeof(char))
although I don't see how it can get past a compiler with no semicolon. The other reads and writes are all for zero bytes. Reading and writing zero bytes is legal, but probably not useful.
# 4  
Old 01-30-2006
Tools

I do a pipe and then another pipe because im creating a pipe, referred with "tubo2",for father process and another one in each iteratino for each child.

the program compile ok. but there is an execution error: "broken pipe". also i realize that father doesnt execute this code:

Code:
...
if (pid)
{
       /* father */
       printf("\nhello..."); /* this line is only an example. 
                                      the program executes it. Everything ok..*/
       for(i=0; i<2; i++)  /* it doest go into this loop. why?! */
       {
                /* modification of "frase" */
                ...
        }
}
else
{
         read(...); /* the function returns -1. Error */
         ...
}


Perderabo:
I didnt paste it well; yes, semicolon is needed. And im going to review rules again!

Mmm, sorry i dont have a high level as you can see... but why did you say that the other writes and reads are all zero?

Last edited by Jariya; 01-30-2006 at 07:10 PM..
# 5  
Old 01-31-2006
Ok!

At last ive seen the problem!

at the top of my code, i did:

dup2(tubo1[0],tubo2[0]);
dup2(tubo1[1],tubo2[1]);

the problem is that dup does an assignment but dup2, firstly does a comparison between tubo1[0] and tubo2[0], though tubo2 isnt initiate! i hadnt this problem before because i always use dup

Thank you!


pd: sorry again (referred to rules)
Login or Register to Ask a Question

Previous Thread | Next Thread

8 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

pstree but without other children of ancestors

Hi, I want to display the process tree of a given PID, however, I don't want to see other children of the ancestors that don't reach the current PID. My goal is, from the tree result, i have to fetch a particular parent process by keyword, and if any other children from parents have the same... (2 Replies)
Discussion started by: ysrini
2 Replies

2. Shell Programming and Scripting

Doing simple math for children.

Hello! I saw that there were a few differente ways to do math within bash scripts. expr and bc are possibilities. But which one to use when? I want to make an simple bash script for children to do math. The script must ask only questions like 1*1= till 10*10= ... No + or - or /... (10 Replies)
Discussion started by: ugurgazi
10 Replies

3. Shell Programming and Scripting

Killing process and children

Hi all, I have been searching all day for a nice solution to this problem. I have three scripts. A start script, a child script and a stop script. Script A (scripta.sh) Its Child Script B (scriptb.sh) Script C (kill_process.sh $PID) Script A correctly traps the kill command sent from... (6 Replies)
Discussion started by: mark007
6 Replies

4. UNIX for Dummies Questions & Answers

How can i use fork,sleep,wait and write in a process with father and son..??

Hi.. I was unable to do (gcc code) which refers to the fork,wait,sleep and write.. what i want to do: A process of father create (fork) a son and will sleep 90 seconds..After this, son process create a grandchild and will sleep 60 seconds..Grandchild process will sleep for 30 seconds..After... (3 Replies)
Discussion started by: gumlucin
3 Replies

5. UNIX for Advanced & Expert Users

Fork() 1 Parent 3 Children

Hi, as I understand fork(), it makes a copy of the parent which becomes a child. But is there anyway to make three children for that one parent. So in other words, if I look up the getppid() of the children, I want them to have the same value?? Thanks in advance to any help! (1 Reply)
Discussion started by: MS_CC
1 Replies

6. Shell Programming and Scripting

Prepend name of directory to children folders

Hi, I am a shell scripting newbie. I am in need of a shell script that will prepend the name of the parent directory to the child directory. For example if the shell script called rename.sh is invoked with ">rename.sh /home/foobar/Simple" and the structure of the folder Simple is : Simple... (7 Replies)
Discussion started by: kalichar
7 Replies

7. UNIX for Advanced & Expert Users

How to follow processes and their children with ps

Hi, I often need to find the child processes of a parent process. There may be a string of 4-5. That is, PPID 884 spawns 890, which spawns 894, which spawns 1017. I'd like to be able to see all of them without having to type in a number of ps -ef commands. Process groups and session ID's are... (2 Replies)
Discussion started by: mschwage
2 Replies

8. Programming

how to creat 1 parent to call 3 children

hi there, im trying to produce this program that would run at first, and when it runs it will fork one child process to a program and then another forking to run this other program, and then another one . i cant seem to get it right can someone help me please here is what is got so far: int... (1 Reply)
Discussion started by: zmanultra
1 Replies
Login or Register to Ask a Question