APUE函数笔记七: 进程关系

原创 2012年03月25日 17:57:02

第九章  进程关系:

#include <unistd.h>
pid_t getpgrp(void);
    get pgid (>0)

#include <unistd.h>
pid_t getpgid(pid_t pid);
    getpgid(0) same as getpgid(getpid()) same as getpgrp()
    if error return -1

#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
    setpgid(0, pgid) same as setpgid(getpid(), pgid)
    setpgid(pid, 0) same as setpgid(pid, pid)
    if error return -1

#include <unistd.h>
pid_t setsid(void);
    if current process is not a process group leader, 
    will create a new session
    else failed
    if success return pgid, else return -1

#include <unistd.h>
pid_t getsid(pid_t pid);
    getsid(0) same as getsid(getpid())

#include <unistd.h>
pid_t tcgetpgrp(int filedes);
    if error return -1
int tcsetpgrp(int filedes, pid_t pgid);
    if success return 0, else return -1

#include <termios.h>
pid_t tcgetsid(int filedes);
    if error return -1

示例:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void 
sig_hup(int signo)
{
    printf("SIGHUP received, pid = %d\n", getpid());
}

void 
pr_ids(const char * name)
{
    printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %d\n", 
           name, getpid(), getppid(), getpgrp(), tcgetpgrp(STDIN_FILENO));
    fflush(stdout);
}

int 
main(void)
{
    char     c;
    pid_t    pid;

    pr_ids("parent");
    if ((pid = fork()) < 0) {
        printf("fork error\n");
        exit(-1);
    }
    else if (pid > 0) {
        sleep(5);
        exit(0);
    }
    else {
        pr_ids("child");
        signal(SIGHUP, sig_hup);
        kill(getpid(), SIGTSTP);
        pr_ids("child");
        if (read(STDIN_FILENO, &c, 1) != 1) {
            printf("read error from controlling TTY, errno = %d\n", errno);
        }
        exit(0);
    }
}

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void 
pr_ids(const char * info)
{
    printf("\n%s: pid = %d, ppid = %d, pgrp = %d, sid = %d, tpgrp = %d\n", 
           info, getpid(), getppid(), getpgrp(), getsid(0), 
           tcgetpgrp(STDIN_FILENO));
    fflush(stdout);
}

int 
main(void)
{
    pid_t    pid;
    int      c;

    if ((pid = fork()) < 0) {
        printf("fork error\n");
        exit(-1);
    }
    else if (pid > 0) {
        sleep(1);
        printf("parent exit\n");
        exit(0);
    }
    else {
        pr_ids("before");
        sleep(2);
        setsid();
        pr_ids("after");
        exit(0);
    }
}

相关文章推荐

《APUE》笔记-第九章-进程关系

重点:终端登录、网络登录、进程组、会话、控制终端、孤儿进程组 1.终端登录 终端或者是本地的(直接连接)或者是远程的(通过调制解调器连接)。在这两种情况下,登录都经由内核中的终端设备驱动程序。 ...

读书笔记-APUE第三版-(9)进程关系

登录过程 终端登录 如上图,init从/etc/ttys中读取终端信息,对每个允许登录的终端,都fork子进程,并执行getty。getty打开终端设备,执行login: execle(“/bi...
  • cargogo
  • cargogo
  • 2015年07月30日 21:15
  • 931

APUE函数笔记十一: 守护进程

第十三章  守护进程: #include void openlog(const char * ident, int option, int facility); void syslog(int...

APUE函数笔记十五: 高级进程间通信(部分)

第十七章  高级进程间通信(部分): #include int fattach(int filedes, const char * path); if success return 0, ...

APUE笔记---第八章 进程控制(函数fork、exit、wait等)

APUE笔记—第八章 进程控制1. 进程标识 每一个进程都有一个非负整数作为唯一进程ID。所以应用程序有时把进程ID作为名字的一部分来创建一个唯一的文件名。 虽然进程是唯一的,但是进程ID是可复用的。...
  • men_wen
  • men_wen
  • 2016年11月10日 22:48
  • 416

APUE函数笔记六: 进程控制

第八章  进程控制: #include pid_t getpid(void); pid_t getppid(void); uid_t getuid(void); uid_t geteuid(v...

APUE函数笔记五: 进程环境

第七章  进程环境: #include void exit(int status); void _Exit(int status); #include void _exit(int statu...

APUE函数笔记十三: 进程间通信

第十五章  进程间通信: #include int pipe(int filedes[2]); if success return 0, else error return -1 #in...

[APUE] 再读之进程关系

本章是最为难懂,最为晦涩的一章。主要讲解进程组,session, 终端,作业之间关系和概念。...

apue:进程关系

进程组、对话期和作业控制等概念和函数。
  • Mr_Avin
  • Mr_Avin
  • 2017年02月09日 19:30
  • 245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:APUE函数笔记七: 进程关系
举报原因:
原因补充:

(最多只允许输入30个字)