🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #5889

Re: Llamada wait

#5889
From: Fernando Arbeiza
Date: Fri, 29 Aug 2003 07:10
82 lines
3380 bytes
On Fri, 29 Aug 2003 07:52:50 +0200, Fernando Arbeiza <arbeizaf@ono.com> wrote:
>> S�, esa es una buena soluci�n, pero... �y los hijos que no son hijos 
>> directos (hijos de los hijos y etc)?.
> 
> Creo que se puede hacer as�:
> 
>     � Llamar a setsid() desde el padre para convertirse en el l�der del
>     grupo de procesos.
>     � Llamar a waitpid() con el propio pid negatido; es decir, desde el
>     padre, llamar algo equivalente a:
>         waitpid(-getpid(), &status, 0);

Lo que te dije no est� bien. Te dar� un error de permisos. Tienes que
hacer primero un fork(), ya que el proceso padre original no puede
llamar a setsid(), pero un hijo suyo s�. Te pongo un ejemplo; y espero
que te quede claro con �l:

/***********
* prueba.c *
***********/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void) {
    pid_t   pid;
    unsigned int    i;

    pid = fork();
    if (pid < 0) {
        perror("Error en fork");
        exit(EXIT_FAILURE);
    } else if (pid > 0) {
        puts("Salgo del primer proceso");
        exit(EXIT_SUCCESS);
    }

    if (setsid() < 0) {
        perror("Error en setsid");
        exit(EXIT_FAILURE);
    }

    pid = fork();
    if (pid < 0) {
        perror("Error en fork");
        exit(EXIT_FAILURE);
    } else if (pid > 0) {
        while (waitpid(-getpid(), NULL, 0) > 0) { ; }
        if (errno == ECHILD) {
            puts("Se acab� la descendencia");
        } else {
            perror("Error en waitpid");
            exit(EXIT_FAILURE);
        }
    } else {
        for (i = 0; i <= 2; i++) {
            pid = fork();
            if (pid < 0) {
                perror("Error en fork");
                exit(EXIT_FAILURE);
            }
        }

        sleep(5);

        puts("Sale un descendiente");
    }

    exit(EXIT_SUCCESS);
}
/* Fin de Fichero */

Un poco lioso, pero funciona.

Un saludo.
-- 
Fernando Arbeiza        <URL: mailto:arbeizaf@ono.com>
Crea tu propio Linux:   <URL: http://www.escomposlinux.org/lfs-es>
Technical Details
Message-ID: <slrnbktv3g.4sd.arbeizaf@jupiter.olimpo.homelinux.org>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!newsfeed00.sul.t-online.de!t-online.de!newsfeed.freenet.de!fu-berlin.de!uni-berlin.de!81-203-248-186.user.ono.COM!not-for-mail
References: <biim35$9fj1a$2@ID-97854.news.uni-berlin.de> <pan.2003.08.28.21.57.43.205314@eresmas.com> <bim5md$b4sjc$1@ID-97854.news.uni-berlin.de> <slrnbktqhi.pb.arbeizaf@jupiter.olimpo.homelinux.org>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,9e2a4d206494c726
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2003-08-29 08:12:32 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!newsfeed00.sul.t-online.de!t-online.de!newsfeed.freenet.de!fu-berlin.de!uni-berlin.de!81-203-248-186.user.ono.COM!not-for-mail
From: Fernando Arbeiza <arbeizaf@ono.com>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Llamada wait
Date: Fri, 29 Aug 2003 09:10:40 +0200
Lines: 82
Message-ID: <slrnbktv3g.4sd.arbeizaf@jupiter.olimpo.homelinux.org>
References: <biim35$9fj1a$2@ID-97854.news.uni-berlin.de> <pan.2003.08.28.21.57.43.205314@eresmas.com> <bim5md$b4sjc$1@ID-97854.news.uni-berlin.de> <slrnbktqhi.pb.arbeizaf@jupiter.olimpo.homelinux.org>
NNTP-Posting-Host: 81-203-248-186.user.ono.com (81.203.248.186)
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8bit
X-Trace: news.uni-berlin.de 1062169951 12216317 81.203.248.186 (16 [148301])
X-Orig-Path: jupiter.olimpo.homelinux.org!news
User-Agent: slrn/0.9.7.4 (Linux)