Sponsored Content
Top Forums Programming waiting for multiple childs - C - waitpid Post 302500276 by wakatana on Monday 28th of February 2011 05:38:22 AM
Old 02-28-2011
waiting for multiple childs - C - waitpid

Hi gurus, I would like to fork more children and then write their return values: so far I tried:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
        pid_t pid;
        int rv=0, i;
        pid_t child_pids[5];


        for (i=1; i<=5; i++){

                /* Multiple child forking */
                switch(pid = fork()){
                        case -1:
                                /* something went wrong */
                                /* parent exits */
                                perror("fork");
                                exit(1);

                        case 0:
                                /*Children process*/
                                child_pids[i] = getpid();
                                printf(" CHILD: number (and return value): %d PID: %d PPID: %d \n", i, getpid(), getppid());
                                exit(i);
                                break;

                                /*Missing code for parent process - will be executed out of loop*/
                }
        }
        /*Parent process*/
        if (pid!=0 && pid!=-1) {
                printf("PARENT: my PID is %d\n", getpid());

                for (i=1; i<=5; i++){
                        waitpid(child_pids[i], NULL, 0);
                        printf("PARENT: Child: %d returned value is: %d\n", i, WEXITSTATUS(child_pids[i]));
                }
        }
}

But returns any random variables for child process:

...
PARENT: Child: 3 returned value is: 13
PARENT: Child: 3 returned value is: 127
...


also tried following
Code:
int main(void)
{
        pid_t pid;
        int rv=0, i;
        pid_t child_pids[5];
        int child_state = 9;
        pid_t rc_pid;


        for (i=1; i<=5; i++){

                /* Multiple child forking */
                switch(pid = child_pids[i] = fork()){
                        case -1:
                                /* something went wrong */
                                /* parent exits */
                                perror("fork");
                                exit(1);

                        case 0:
                                /*Children process*/
                                //child_pids[i] = getpid();
                                printf(" CHILD: number (and return value): %d PID: %d PPID: %d \n", i, getpid(), getppid());
                                exit(i);
                                break;

                                /*Missing code for parent process*/
                }
        }
        /*Parent process*/
        if (pid!=0 && pid!=-1) {
                printf("PARENT: my PID is %d\n", getpid());

                for (i=1; i<=5; i++){
                        rc_pid = waitpid(child_pids[i], NULL, 0);
                        printf("PARENT: Child: %d returned value is: %d\n", i, WEXITSTATUS(child_pids[i]));
                }
        }
}

but returns always number 19 as return code of children
...
PARENT: Child: 4 returned value is: 19
...

Probably something something is wrong with waitpid() function
Thanks a lot.
 

10 More Discussions You Might Find Interesting

1. Programming

problems with FORK() and WAITPID()

Dear All, I'm trying to write multithreading TCP Daemon which executes external program when new network connection arrives on a socket. After accept() I'm doing fork() for initiating of new child process, in which will be executed external program. After child creation I'm doing fork() again,... (3 Replies)
Discussion started by: Polkovnik
3 Replies

2. Shell Programming and Scripting

How to kill a process and its childs given pid and userid

I need to write a shell script which would take 2 arguments pid , userid. Then it should kill all the child process under it. If a child process is not killed then it should wait for 1 minute and should kill. can anybody give me the idea to write it? (0 Replies)
Discussion started by: nani_g
0 Replies

3. Programming

share file descriptor between childs

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <signal.h> #include <unistd.h> #include <string.h> #define BUFF_SIZE 256 #define CHILDS 4 #define DATAFILE "Client_Files.txt" void worker(int n);... (3 Replies)
Discussion started by: dlcpereira
3 Replies

4. Programming

forking. sharing global data in childs

hi, i want to write a code for forking 3 4 child. n wants that every child process one of the account from global account list. i wrote a program for that, but problem is every child is processing every account in list. what can me done to avoid it. attaching code with it #include <stdio.h>... (2 Replies)
Discussion started by: anup13
2 Replies

5. Programming

Need help with fork, forking multiple childs and shared memory

Hi all, I m writing an application, where i need to fork multiple childs and those child should handle particular task given to them. More descriptive. For example, suppose i have 4 Network, each network has multiple nodes. Now on the basis of network child should be forked and these child... (8 Replies)
Discussion started by: helpmeforlinux
8 Replies

6. Shell Programming and Scripting

Executing multiple processes without waiting for their exit status.

Hello Friends, Hope you are doing well. I just need a help in executing multiple processes. I've written a shell script which calls another scritps. But the problem is there are too many processes to run, and each process takes about a min to finish its execution. So, I want to just... (3 Replies)
Discussion started by: singh.chandan18
3 Replies

7. Programming

How Can I share a socket between childs?

Hello guys! I had seen some posts at this forum talking about my problem, but maybe my scenario is a little different, and I want other solutions. I saw users of this forums saying that the way to shared sockets is using UNIX Sockets, but this is the only way in my scenario? My Scenario:... (4 Replies)
Discussion started by: serpens11
4 Replies

8. Programming

[C]Fork and waitpid

Hi folks, I am writing a simple program to understand how fork() and waitpid works, but it doesn't seem that is working like I wanted. if(fork()==0){ //el hijo pid1=getpid(); printf("\nSoy el hijo %d",pid1); }else { //el padre if (fork()==0) { //el hijo pid2=getpid();... (2 Replies)
Discussion started by: lamachejo
2 Replies

9. Programming

waitpid and grandchildren

I'm attempting to write a daemon that will start, stop, and monitor processes across a network of servers, meaning that a daemon would start on each server, attempt to connect to siblings at regular intervals (if there are unconnected siblings), and start services as remote dependencies are... (3 Replies)
Discussion started by: kshots
3 Replies

10. Programming

Pipe between Childs

Hey guys, I have to make a C program that simulates this command : cat (files here) | sort > file.txt So, I start and create a pipe. Then create the first child. This first child will execute the Cat through the pipe. Then create a second child that will execute sort, with input from... (4 Replies)
Discussion started by: Poppo
4 Replies
pctx_set_events(3CPC)				    CPU Performance Counters Library Functions				     pctx_set_events(3CPC)

NAME
pctx_set_events - associate callbacks with process events SYNOPSIS
cc [ flag... ] file... -lpctx [ library... ] #include <libpctx.h> typedef enum { PCTX_NULL_EVENT = 0, PCTX_SYSC_EXEC_EVENT, PCTX_SYSC_FORK_EVENT, PCTX_SYSC_EXIT_EVENT, PCTX_SYSC_LWP_CREATE_EVENT, PCTX_INIT_LWP_EVENT, PCTX_FINI_LWP_EVENT, PCTX_SYSC_LWP_EXIT_EVENT } pctx_event_t; typedef int pctx_sysc_execfn_t(pctx_t *pctx, pid_t pid, id_t lwpid, char *cmd, void *arg); typedef void pctx_sysc_forkfn_t(pctx_t *pctx, pid_t pid, id_t lwpid, pid_t child, void *arg); typedef void pctx_sysc_exitfn_t(pctx_t *pctx, pid_t pid, id_t lwpid, void *arg); typedef int pctx_sysc_lwp_createfn_t(pctx_t *pctx, pid_t pid, id_t lwpid, void *arg); typedef int pctx_init_lwpfn_t(pctx_t *pctx, pid_t pid, id_t lwpid, void *arg); typedef int pctx_fini_lwpfn_t(pctx_t *pctx, pid_t pid, id_t lwpid, void *arg); typedef int pctx_sysc_lwp_exitfn_t(pctx_t *pctx, pid_t pid, id_t lwpid, void *arg); int pctx_set_events(pctx_t *pctx...); DESCRIPTION
The pctx_set_events() function allows the caller (the controlling process) to express interest in various events in the controlled process. See pctx_capture(3CPC) for information about how the controlling process is able to create, capture and manipulate the controlled process. The pctx_set_events() function takes a pctx_t handle, followed by a variable length list of pairs of pctx_event_t tags and their corre- sponding handlers, terminated by a PCTX_NULL_EVENT tag. Most of the events correspond closely to various classes of system calls, though two additional pseudo-events (init_lwp and fini_lwp) are provided to allow callers to perform various housekeeping tasks. The init_lwp handler is called as soon as the library identifies a new LWP, while fini_lwp is called just before the LWP disappears. Thus the classic "hello world" program would see an init_lwp event, a fini_lwp event and (process) exit event, in that order. The table below displays the interactions between the states of the controlled process and the handlers executed by users of the library. +-------------------------------+--------------+------------------------------------+ |System Calls and pctx Handlers | | | +-------------------------------+--------------+------------------------------------+ | System call | Handler | Comments | +-------------------------------+--------------+------------------------------------+ | exec,execve | fini_lwp |Invoked serially on all lwps in the | | | |process. | | | exec |Only invoked if the exec() system | | | |call succeeded. | | | init_lwp |If the exec succeeds, only invoked | | | |on lwp 1. If the exec fails, | | | |invoked serially on all lwps in the | | | |process. | +-------------------------------+--------------+------------------------------------+ | fork, vfork, fork1 | fork |Only invoked if the fork() system | | | |call succeeded. | +-------------------------------+--------------+------------------------------------+ | exit | fini_lwp |Invoked on all lwps in the process. | | | exit | Invoked on the exiting lwp. | +-------------------------------+--------------+------------------------------------+ Each of the handlers is passed the caller's opaque handle, a pctx_t handle, the pid, and lwpid of the process and lwp generating the event. The lwp_exit, and (process) exit events are delivered before the underlying system calls begin, while the exec, fork, and lwp_create events are only delivered after the relevant system calls complete successfully. The exec handler is passed a string that describes the command being executed. Catching the fork event causes the calling process to fork(2), then capture the child of the controlled process using pctx_capture() before handing control to the fork handler. The process is released on return from the handler. RETURN VALUES
Upon successful completion, pctx_set_events() returns 0. Otherwise, the function returns -1. EXAMPLES
Example 1 HandleExec example. This example captures an existing process whose process identifier is pid, and arranges to call the HandleExec routine when the process performs an exec(2). static void HandleExec(pctx_t *pctx, pid_t pid, id_t lwpid, char *cmd, void *arg) { (void) printf("pid %d execed '%s' ", (int)pid, cmd); } int main() { ... pctx = pctx_capture(pid, NULL, 1, NULL); (void) pctx_set_events(pctx, PCTX_SYSC_EXEC_EVENT, HandleExec, ... PCTX_NULL_EVENT); (void) pctx_run(pctx, 0, 0, NULL); pctx_release(pctx); } ATTRIBUTES
See attributes(5) for descriptions of the following attributes: +-----------------------------+-----------------------------+ | ATTRIBUTE TYPE | ATTRIBUTE VALUE | +-----------------------------+-----------------------------+ |Interface Stability |Evolving | +-----------------------------+-----------------------------+ |MT-Level |Unsafe | +-----------------------------+-----------------------------+ SEE ALSO
exec(2), exit(2), fork(2), vfork(2), fork1(2), cpc(3CPC), libpctx(3LIB), proc(4), attributes(5) SunOS 5.11 13 May 2003 pctx_set_events(3CPC)
All times are GMT -4. The time now is 03:00 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy