美文网首页
进程控制

进程控制

作者: yuq329 | 来源:发表于2020-07-02 10:01 被阅读0次

进程控制

#include <apue.h>
#include <error.h>

int globvar = 6;
char buf[] = "a write to stdout\n";

int main(void) {
    int var;
    pid_t pid;
    var = 88;
    
    if (write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) - 1)
        err_sys("write error");
    printf("before fork\n");

    if ((pid = fork()) < 0) {
        err_sys("fork error");
    } else if (pid == 0) {
        globvar++;
        var++;
    } else {
        sleep(2);
    }
    printf("pid = %ld, glob = %d, var = %d\n", (long) getpid(), globvar, var);
    exit(0);
}
#include <apue.h>
#include <error.h>

int globvar = 6;
char buf[] = "a write to stdout\n";

int main(void) {
    int var;
    pid_t pid;
    var = 88;

    if (write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) - 1)
        err_sys("write error");
    printf("before vfork\n");

    if ((pid = vfork()) < 0) {
        err_sys("fork error");
    } else if (pid == 0) {
        globvar++;
        var++;
        _exit(0);
    }
    printf("pid = %ld, glob = %d, var = %d\n", (long) getpid(), globvar, var);
    exit(0);
}
#include <apue.h>
#include <error.h>
#include <sys/wait.h>

void pr_exit(int status) {
    if (WIFEXITED(status))
        printf("normal termination, exit status = %d\n", WEXITSTATUS(status));
    else if (WIFSIGNALED(status))
        printf("abnormal termination, signal number = %d%s\n", WTERMSIG(status),
#ifdef WCOREDUMP
                WCOREDUMP(status) ? " (core file generated)" : "");
#else
               "");
#endif
    else if (WIFSTOPPED(status))
        printf("child stopped, signal number = %d\n", WSTOPSIG(status));
}

int main(void) {
    pid_t pid;
    int status;
    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
        exit(7);

    if (wait(&status) != pid)
        err_sys("wait error\n");
    pr_exit(status);

    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0) {
        status /= 0;
    }

    if (wait(&status) != pid)
        err_sys("wait error");
    pr_exit(status);
    exit(0);
}
#include <apue.h>
#include <error.h>
#include <sys/wait.h>

int main(void) {
    pid_t pid;
    if ((pid = fork()) < 0) {
        err_sys("fork error");
    } else if (pid == 0) {
        if ((pid = fork()) < 0)
            err_sys("fork error");
        else if (pid > 0) {
            printf("first child pid is: %d\n", getpid());
            printf("first child, parent pid = %ld\n", (long) getppid());
            exit(0);
        }else{
            printf("second child, parent pid = %ld\n", (long) getppid());
        }

        sleep(2);
        printf("second child pid is: %d\n", getpid());
        printf("second child, parent pid = %ld\n", (long) getppid());
        exit(0);
    }
    printf("current pid is: %d\n", getpid());
    if (waitpid(pid, NULL, 0) != pid)
        err_sys("waitpid error");
    sleep(2);
    exit(0);
}
#include <apue.h>
#include <error.h>

static void charatatime(char *);

int main(void) {
    pid_t pid;
    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
        charatatime("output from child\n");
    else
        charatatime("output from parent\n");
    exit(0);
}

static void charatatime(char *str) {
    char *ptr;
    int c;
    setbuf(stdout, NULL);
    for (ptr = str; (c = *ptr++) != 0;)
        putc(c, stdout);
}
#include <apue.h>
#include <error.h>
#include <tellwait.h>

static void charatatime(char *);

int main(void) {
    pid_t pid;
    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0) {
//        WAIT_PARENT();
        charatatime("output from child\n");
        TELL_PARENT(getppid());
    } else {
        WAIT_CHILD();
        charatatime("output from parent\n");
//        TELL_CHILD(pid);
    }

    exit(0);
}

static void charatatime(char *str) {
    char *ptr;
    int c;
    setbuf(stdout, NULL);
    for (ptr = str; (c = *ptr++) != 0;)
        putc(c, stdout);
}
//tellwait.h
#include "apue.h"

static volatile sig_atomic_t sigflag; /* set nonzero by sig handler */
static sigset_t newmask, oldmask, zeromask;

static void sig_usr(int signo)  /* one signal handler for SIGUSR1 and SIGUSR2 */
{
    sigflag = 1;
}

void TELL_WAIT(void)
{
    if (signal(SIGUSR1, sig_usr) == SIG_ERR)
        err_sys("signal(SIGUSR1) error");
    if (signal(SIGUSR2, sig_usr) == SIG_ERR)
        err_sys("signal(SIGUSR2) error");
    sigemptyset(&zeromask);
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGUSR1);
    sigaddset(&newmask, SIGUSR2);

    /* Block SIGUSR1 and SIGUSR2, and save current signal mask */
    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
        err_sys("SIG_BLOCK error");
}

void TELL_PARENT(pid_t pid)
{
    kill(pid, SIGUSR2);     /* tell parent we're done */
}

void WAIT_PARENT(void)
{
    while (sigflag == 0)
        sigsuspend(&zeromask);  /* and wait for parent */
    sigflag = 0;

    /* Reset signal mask to original value */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
        err_sys("SIG_SETMASK error");
}

void TELL_CHILD(pid_t pid)
{
    kill(pid, SIGUSR1);         /* tell child we're done */
}

void WAIT_CHILD(void)
{
    while (sigflag == 0)
        sigsuspend(&zeromask);  /* and wait for child */
    sigflag = 0;

    /* Reset signal mask to original value */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
        err_sys("SIG_SETMASK error");
}
#include <apue.h>
#include <error.h>
#include <sys/wait.h>

char *env_init[] = {"USER=unlnown", "PATH=/tmp", NULL};

int main(void) {
    pid_t pid;
    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
        if (execle("/Users/yuq/code/c_plus_plus/aupe3/build/7_proc_env/pro_env", "pro_env", "myarg1", "MY ARG2", (char *) 0, env_init) < 0)
            err_sys("ececle error");

    if (waitpid(pid, NULL, 0) < 0)
        err_sys("wait error");

    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
        if (execlp("pro_env", "pro_env", "only 1 arg", (char *) 0) < 0)
            err_sys("execlp error");

    exit(0);
}
#include <apue.h>
#include <error.h>
#include <sys/wait.h>

char *env_init[] = {"USER=unlnown", "PATH=/tmp", NULL};

int main(void) {
    pid_t pid;

    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
        if (execle("/Users/yuq/code/c_plus_plus/aupe3/build/7_proc_env/pro_env", "pro_env", "myarg1", "MY ARG2",
                   (char *) 0, env_init) < 0)
            err_sys("ececle error");

    if (waitpid(pid, NULL, 0) < 0)
        err_sys("wait error");

    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0){
        if (setenv("PATH", "/Users/yuq/code/c_plus_plus/aupe3/build/7_proc_env/", 1) < 0)
            err_sys("set environment value error");
        if (execlp("pro_env", "pro_env", "only 1 arg", (char *) 0) < 0)
            err_sys("execlp error");
    }

    exit(0);
}
#include <apue.h>
#include <error.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>

int system(const char *cmdstring) {
    pid_t pid;
    int status;
    if (cmdstring == NULL) {
        return 1;
    }
    if ((pid = fork()) < 0) {
        status = -1;
    } else if (pid == 0) {
        execl("/bin/sh", "sh", "-c", cmdstring, (char *) 0);
        _exit(127);
    } else {
        while (waitpid(pid, &status, 0) < 0) {
            if (errno != EINTR) {
                status = -1;
                break;
            }
        }
    }
    return status;
}

int main(void) {
    int status;
    if ((status = system("date")) < 0) {
        err_sys("system() error");
    }

    pr_exit(status);

    if ((status = system("nosuchcommand")) < 0) {
        err_sys("system() error");
    }

    pr_exit(status);

    if ((status = system("who; exit 44")) < 0) {
        err_sys("system() error");
    }

    pr_exit(status);

    exit(0);
}
#include <apue.h>
#include <error.h>

int main(void) {
    pid_t pid;
    if ((pid = fork()) < 0) {
        err_sys("fork error");
    } else if (pid != 0) {
        sleep(2);
        exit(2);
    }
    if ((pid = fork()) < 0) {
        err_sys("fork error");
    } else if (pid != 0) {
        sleep(4);
        abort();
    }

    if ((pid = fork()) < 0) {
        err_sys("fork error");
    } else if (pid != 0) {
        execl("/bin/dd", "dd", "if=/etc/passwd", "of=/dev/null", NULL);
        exit(7);
    }

    if ((pid = fork()) < 0) {
        err_sys("fork error");
    } else if (pid != 0) {
        sleep(8);
        exit(0);
    }
    sleep(6);
    kill(getpid(), SIGKILL);
    exit(6);
}
#include <apue.h>
#include <error.h>
#include <sys/acct.h>

#if defined(BSD)
#define acct acctv2
#define ac_flag ac_trailer.ac_flag
#define FMT "%-*.*s e = %.0f, chars = %.0f, %c %c %c %c\n"
#elif defined(HAS_AC_STAT)
#define FMT "%-*.*s e = %6ld, chars = %7ld, stat = %3u: %c %c %c %c\n"
#else
#define FMT "%-*.*s e = %6ld, chars = %7ld, %c %c %c %c\n"
#endif

#if !defined(HAS_ACORE)
#define ACORE 0
#endif
#if !defined(HAS_AXSIG)
#define AXSIG 0
#endif

#if !defined(BSD)

static unsigned long compt2ulong(comp_t comptime) {
    unsigned long val;
    int exp;
    val = comptime & 0x1fff;
    exp = (comptime >> 13) & 7;
    while (exp--)
        val *= 8;
    return val;
}

#endif

int main(int argc, char *argv[]) {
    struct acct acdata;
    FILE *fp;
    if (argc != 2)
        err_quit("usage: acct filename");
    if ((fp = fopen(argv[1], "r")) == NULL)
        err_sys("can't open %s", argv[1]);
    while (fread(&acdata, sizeof(acdata), 1, fp) == 1) {
        printf(FMT, (int) sizeof(acdata.ac_comm), (int) sizeof(acdata.ac_comm), acdata.ac_comm,
#if defined(BSD)
                acdata.ac_etime,acdata.ac_io,
#else
               compt2ulong(acdata.ac_etime), compt2ulong(acdata.ac_io),
#endif
#if defined(HAS_AC_STAT)
                (unsigned char) acdata.ac_stat,
#endif
               acdata.ac_flag & ACORE ? 'D' : ' ',
               acdata.ac_flag & AXSIG ? 'X' : ' ',
               acdata.ac_flag & AFORK ? 'F' : ' ',
               acdata.ac_flag & ASU ? 'S' : ' ');
    }

    if (ferror(fp))
        err_sys("read error");
    exit(0);
}
#include <apue.h>
#include <error.h>
#include <sys/time.h>
#include <errno.h>

#if defined(MACOS)
#include <sys/syslimits.h>
#elif defined(SOLARIS)
#include <limits.h>
#elif defined(BSDLY)

#include <sys/param.h>

#endif

unsigned long long count;
struct timeval end;

void checktime(char *str) {
    struct timeval tv;
    gettimeofday(&tv, NULL);
    if (tv.tv_sec >= end.tv_sec && tv.tv_usec >= end.tv_usec) {
        printf("%s count  = %lld\n", str, count);
        exit(0);
    }
}

int main(int argc, char *argv[]) {
    pid_t pid;
    char *s;
    int nzero, ret;
    int adj = 0;
    setbuf(stdout, NULL);

#if defined(NZERO)
    nzero = NZERO;
#elif defined(_SC_NZERO)
    nzero=sysconf(_SC_NZERO);
#else
#error NZERO undefined
#endif
    printf("NZERO = %d\n", nzero);
    if (argc == 2)
        adj = strtol(argv[1], NULL, 10);
    gettimeofday(&end, NULL);
    end.tv_sec += 10;
    if ((pid = fork()) < 0)
        err_sys("fork failed");
    else if (pid == 0) {
        s = "child ";
        printf("currrent nice value in child is %d, adjusting by %d\n", nice(0) + nzero, adj);
        errno = 0;
        if ((ret = nice(adj)) == -1 && errno != -1)
            err_sys("child set scheduling priority");
        printf("now child nice value is %d\n", ret + nzero);
    } else {
        s = "parent";
        printf("current nice value in parent is %d\n", nice(0) + nzero);
    }
    for (;;) {
        if (++count == 0)
            err_quit("%s counter wrap", s);
        checktime(s);
    }
}
#include <apue.h>
#include <error.h>
#include <sys/times.h>

static void pr_times(clock_t, struct tms *, struct tms *);

static void do_cmd(char *);

int main(int argc, char *argv[]) {
    int i;
    setbuf(stdout, NULL);
    for (i = 1; i < argc; i++) {
        do_cmd(argv[i]);
    }
    exit(0);
}

static void do_cmd(char *cmd) {
    struct tms tmsstart, tmsend;
    clock_t start, end;
    int status;
    printf("\ncommand: %s\n", cmd);
    if ((start = times(&tmsstart)) == -1)
        err_sys("times error");
    if ((status = system(cmd)) < 0) {
        err_sys("system() error");
    }
    if ((end = times(&tmsend)) == -1)
        err_sys("times error");
    pr_times(end - start, &tmsstart, &tmsend);
    pr_exit(status);
}

static void pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend) {
    static long clktck = 0;
    if (clktck == 0) {
        if ((clktck = sysconf(_SC_CLK_TCK)) < 0)
            err_sys("sysconf error");
    }
    printf(" real: %7.2f\n", real / (double) clktck);
    printf(" user: %7.2f\n", (tmsend->tms_utime - tmsstart->tms_utime) / (double) clktck);
    printf(" sys: %7.2f\n", (tmsend->tms_stime - tmsstart->tms_stime) / (double) clktck);
    printf(" child user: %7.2f\n", (tmsend->tms_cutime - tmsstart->tms_cutime) / (double) clktck);
    printf(" child sys: %7.2f\n", (tmsend->tms_cstime - tmsstart->tms_cstime) / (double) clktck);
}

相关文章

  • 第二章 进程的描述与控制2

    2.2进程控制与同步 一、进程控制 1、进程控制的基本过程: 1)进程的创建 2)进程的终止 3)进程的阻塞与唤醒...

  • 操作系统第二章第二部分

    2.2进程控制 进程控制的基本过程: ¡进程的创建 ¡进程的终止 ¡进程的阻塞与唤醒 ¡进程的挂起和激活 1.进程...

  • 二.进程(2)进程控制

    2.2 进程控制 进程控制的基本过程: 进程的创建 进程的终止 进程的阻塞与唤醒 进程的挂起和激活 关于进程的亲属...

  • 进程控制块PCB

    进程控制块 每一个进程内核中都有一个进程控制块(PCB)来维护进程相关的信息,linux内核的进程控制块时 tas...

  • APUE第9章 进程关系、进程组、会话

    9 进程关系 在第8章学习了进程的控制原语,通过各种进程原语可以对进程进行控制,包括新建进程、执行新程序、终止进程...

  • 进程管理

    进程 进程由程序、数据、进程控制块(PCB)组成。而进程控制块其实本质就是个数据结构,用来记录进程信息的。 进程的...

  • PHP 扩展知识

    pcntl扩展:(进程控制) pcntl扩展是进程控制的重要扩展,但目前Win不支持。包含进程创建、进程监控、...

  • child_process

    目录 进程 线程 Node.js的进程控制 Node.js的线程控制 进程 Process 场景 notepad....

  • 进程(二)—— 控制与通信

    1. 进程控制 进程控制的主要功能是对系统中所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转...

  • 异常控制流

    异常控制流 7.1 进程与进程的上下文切换 程序和进程的概念 进程的逻辑控制流 进程的上下文切换 进程的私有地址空...

网友评论

      本文标题:进程控制

      本文链接:https://www.haomeiwen.com/subject/aselqktx.html