⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 killpgrp.c

📁 开源备份软件源码 AMANDA, the Advanced Maryland Automatic Network Disk Archiver, is a backup system that a
💻 C
字号:
/* * Amanda, The Advanced Maryland Automatic Network Disk Archiver * Copyright (c) 1991-1998 University of Maryland at College Park * All Rights Reserved. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of U.M. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission.  U.M. makes no representations about the * suitability of this software for any purpose.  It is provided "as is" * without express or implied warranty. * * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: the Amanda Development Team.  Its members are listed in a * file named AUTHORS, in the root directory of this distribution. *//* * $Id: killpgrp.c,v 1.17 2006/07/25 18:27:56 martinea Exp $ * * if it is the process group leader, it kills all processes in its * process group when it is killed itself. * * argv[0] is the killpgrp program name * argv[1] is the config name or NOCONFIG * */#include "amanda.h"#include "version.h"#include "util.h"#ifdef HAVE_GETPGRP#ifdef GETPGRP_VOID#define AM_GETPGRP() getpgrp()#else#define AM_GETPGRP() getpgrp(getpid())#endif#else/* we cannot check it, so let us assume it is ok */#define AM_GETPGRP() getpid()#endif int main(int argc, char **argv);static void term_kill_soft(int sig);static void term_kill_hard(int sig);intmain(    int		argc,    char **	argv){    int ch;    char *exitstr;    amwait_t status;    /*     * Configure program for internationalization:     *   1) Only set the message locale for now.     *   2) Set textdomain for all amanda related programs to "amanda"     *      We don't want to be forced to support dozens of message catalogs.     */      setlocale(LC_MESSAGES, "C");    textdomain("amanda");     safe_fd(-1, 0);    safe_cd();    set_pname("killpgrp");    dbopen(DBG_SUBDIR_CLIENT);    if (argc < 2) {	error("Need at least 2 arguments\n");	/*NOTREACHED*/    }    dbprintf(_("version %s\n"), version());    dbprintf(_("config: %s\n"), argv[1]);    if (strcmp(argv[1], "NOCONFIG") != 0)	dbrename(argv[1], DBG_SUBDIR_CLIENT);#ifdef WANT_SETUID_CLIENT    check_running_as(RUNNING_AS_CLIENT_LOGIN | RUNNING_AS_UID_ONLY);    if (!become_root()) {	error(_("error [%s could not become root (is the setuid bit set?)]\n"), get_pname());	/*NOTREACHED*/    }#else    check_running_as(RUNNING_AS_CLIENT_LOGIN);#endif    if (AM_GETPGRP() != getpid()) {	error(_("error [must be the process group leader]"));	/*NOTREACHED*/    }    signal(SIGTERM, term_kill_soft);    /* Consume any extranious input */    do {	ch = getchar();	/* wait until EOF */    } while (ch != EOF);    term_kill_soft(0);    for(;;) {	if (wait(&status) != -1)	    break;	if (errno != EINTR) {	    error(_("error [wait() failed: %s]"), strerror(errno));	    /*NOTREACHED*/	}    }    exitstr = str_exit_status("child", status);    dbprintf("%s\n", exitstr);    amfree(exitstr);    /*@ignore@*/    return WIFEXITED(status)?WEXITSTATUS(status):1;    /*@end@*/}static void term_kill_soft(    int sig){    pid_t dumppid = getpid();    int killerr;    (void)sig;	/* Quiet unused parameter warning */    signal(SIGTERM, SIG_IGN);    signal(SIGALRM, term_kill_hard);    alarm(3);    /*     * First, try to kill the dump process nicely.  If it ignores us     * for three seconds, hit it harder.     */    dbprintf(_("sending SIGTERM to process group %ld\n"), (long) dumppid);    killerr = kill(-dumppid, SIGTERM);    if (killerr == -1) {	dbprintf(_("kill failed: %s\n"), strerror(errno));    }}static void term_kill_hard(    int sig){    pid_t dumppid = getpid();    int killerr;    (void)sig;	/* Quiet unused parameter warning */    dbprintf(_("It won\'t die with SIGTERM, but SIGKILL should do.\n"));    dbprintf(_("Don't expect any further output, this will be suicide.\n"));    killerr = kill(-dumppid, SIGKILL);    /* should never reach this point, but so what? */    if (killerr == -1) {	dbprintf(_("kill failed: %s\n"), strerror(errno));	dbprintf(_("waiting until child terminates\n"));    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -