sorry im very new to this but i am supposed to create 3 processes A,B, and C and have a direct link from a to b, b to c, and c to a.
here is my code. It does work, however if you look at what I bolded as long as my final read is p[0] it seems to always work, regardless of the bolded section.
OK, first off, you've got a total of four processes here, not three... (Is that what you wanted? For the process I call A to spawn off three children? Or did you want three processes total?)
Process A (original process): pid = B, pid1 = C
Process B (first child of A): pid = 0, pid1 = D
Process C (second child of A): pid = B, pid1 = 0
Process D (child of B): pid = 0, pid1 = 0
Quote:
This if statement will actually run for three of the four processes: A, C, and D:
Process A: (pid | pid1 == 0) = (B | C == 0) = (B | 0) = true
Process B: (pid | pid1 == 0) = (0 | D == 0) = (0 | 0) = false
Process C: (pid | pid1 == 0) = (B | 0 == 0) = (B | true) = true
Process D: (pid | pid1 == 0) = (0 | 0 == 0) = (0 | true) = true
(where true is some nonzero value...)
Quote:
p[2] is uninitialized. pipe() only creates two file descriptors: p[0], the read end of the pipe, and p[1], the write end of the pipe.
Also, from the problem description it sounded like you wanted each of the three communicating processes to have the ability to write messages to and receive messages from each of the other two communicating processes. This suggests you need to create at least three pipes (three invocations of pipe() in the parent process). I say "at least three pipes" because if these processes are running concurrently, allowing two processes to write to the same file descriptor could have unpredictable results. (Using write() to write a single, whole message will probably be safe - but if the message were large it's possible the write would block waiting for the reader to read some data out - in which case I think it's possible the other process's write() could wind up getting in before the first write() finishes its message. (Not sure, though. write() is a system call so the kernel may synchronize it...)
Remember that pipe() creates two file descriptors but just one pipe. A pipe with an input end and an output end. A file descriptor you get from pipe() is either read-only or write-only - you can never read and write from the same file descriptor, when the file descriptor was obtained with pipe().
OK, first off, you've got a total of four processes here, not three... (Is that what you wanted? For the process I call A to spawn off three children? Or did you want three processes total?)
Process A (original process): pid = B, pid1 = C
Process B (first child of A): pid = 0, pid1 = D
Process C (second child of A): pid = B, pid1 = 0
Process D (child of B): pid = 0, pid1 = 0
This if statement will actually run for three of the four processes: A, C, and D:
Process A: (pid | pid1 == 0) = (B | C == 0) = (B | 0) = true
Process B: (pid | pid1 == 0) = (0 | D == 0) = (0 | 0) = false
Process C: (pid | pid1 == 0) = (B | 0 == 0) = (B | true) = true
Process D: (pid | pid1 == 0) = (0 | 0 == 0) = (0 | true) = true
(where true is some nonzero value...)
p[2] is uninitialized. pipe() only creates two file descriptors: p[0], the read end of the pipe, and p[1], the write end of the pipe.
Also, from the problem description it sounded like you wanted each of the three communicating processes to have the ability to write messages to and receive messages from each of the other two communicating processes. This suggests you need to create at least three pipes (three invocations of pipe() in the parent process). I say "at least three pipes" because if these processes are running concurrently, allowing two processes to write to the same file descriptor could have unpredictable results. (Using write() to write a single, whole message will probably be safe - but if the message were large it's possible the write would block waiting for the reader to read some data out - in which case I think it's possible the other process's write() could wind up getting in before the first write() finishes its message. (Not sure, though. write() is a system call so the kernel may synchronize it...)
Remember that pipe() creates two file descriptors but just one pipe. A pipe with an input end and an output end. A file descriptor you get from pipe() is either read-only or write-only - you can never read and write from the same file descriptor, when the file descriptor was obtained with pipe().
yes I actually wanted processes A, B, and C communicating with each other, but I only wanted to pipe a message from a->b->c. I didnt realize I had created 4 processes.
Is there anyway to just create 3 processes? how about a way to just get variable pipes communicating with each other?
yes I actually wanted processes A, B, and C communicating with each other, but I only wanted to pipe a message from a->b->c. I didnt realize I had created 4 processes.
Is there anyway to just create 3 processes? how about a way to just get variable pipes communicating with each other?
Sure. The reason you wound up with a total of four processes is because each call to fork() returns twice: once in the original process and once in the new one. So after you make the first call to fork(), there are two processes - both of which go on to call the second fork().
To create a total of three processes, make sure you only fork twice. You can do this by checking the return value of fork() to make sure you're in the process which should fork.
Now, if your communication channels only need to be such that A can send messages to B, and B can send messages to C, you wind up with something like this:
'Course there's various error checking and stuff you'd want to do in there that's not shown above - but that's the basic idea.
Sure. The reason you wound up with a total of four processes is because each call to fork() returns twice: once in the original process and once in the new one. So after you make the first call to fork(), there are two processes - both of which go on to call the second fork().
To create a total of three processes, make sure you only fork twice. You can do this by checking the return value of fork() to make sure you're in the process which should fork.
Now, if your communication channels only need to be such that A can send messages to B, and B can send messages to C, you wind up with something like this:
'Course there's various error checking and stuff you'd want to do in there that's not shown above - but that's the basic idea.
oh ok thanks alot, I think i understand now . I have a project coming up where ill need to use some pipes and I this really fills in some of my blanks.
Hello Team,
In a application filesystem, there is a process keep creating the log files. Due to that the filesystem keep getting full. Please let me know how to identify the process which is keep writing in the filesystem.
fuser -u <FS> will show only the user who using the filesystem.... (3 Replies)
I have a script, it will create 3 files
---------
file1=dataout/file1.txt
file2=dataout/file2.txt
file3=dataout/file3.txt
echo "0" > $file3
---------
For file1 and file2 we are not initializing any values.
But for file3 we are initializing the value of 0.
When we execute the... (3 Replies)
Hi all,
First of all thanks in advance for reading my post and for your heart for helping me.
I am trying to create a message queue using mq_open(name,oflags,mode_t,attr) method. But that function call is returning with an error code EFAULT. By googling it I found that it happens when there is... (10 Replies)
Hi guys.
i have wrote a simple program to test message queue attributes. here it is:
#include <stdio.h>
#include <stdlib.h>
#include <mqueue.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
int main()
{
struct mq_attr attr;
mqd_t mqd;
... (2 Replies)
When I run the following script I get the following error message whcih I would like to suppress when the kill is issued:
./kill.sh: line 13: 31854 Killed nc -l -p 12345
Script:
#!/bin/bash
echo running nc in the background
nc -l -p 12345 &
PID=$!
echo nc pid: $PID
... (1 Reply)
hello,
I had to implement a message queue application....between 30 processes......
all 30 proceses are getting data from serial port....
And here is THE FLOW::::::::1 connector process...which is linked with message queue to all the 30 applications. Processes get the data from serial port and... (9 Replies)
Hi,
Am supposed to use message queues to send and receive messages between the processes. when i was working on that i realised that the message qid and the message queue related data should be maintained in a shared memory so that it can be accessed by all the processes. Could anybody refer... (10 Replies)
can anyone tell me how to Create ten processes and display useful information about them including PID, starting-time in unix using c or c++ language. i tried to create 10 different processes using fork and exec but i couldn't display those process info:PID,STIME.
my sample code
......... (2 Replies)
i want to create 3 child processes from the same parent using folk. I know how to use folk but my child processes did not come from the same parent. Any suggestion what i did wrong ? (12 Replies)
I have written a script that appears to work correctly in testing, but is coming up with a starnge error message,
script_name: test: 0403-004 Specify a parameter with this command.
Redirection or piping of stdin or stdout is allowed only with -b. (156).
The script is run by different... (2 Replies)