AUPE学习第八章------进程控制

每个进程都有一个非负整形表示的唯一进程ID。

init进程是一号进程,是第一个用户态的进程。它负责内核启动以后启动一个unix系统,

它读取的配置文件一般在/etc/rc*、/etc/inittab、/etc/init.d中。

下面的函数返回进程的一些标识:

pid_t   getpid(void)   //调用进程的进程ID.

pid_t   getppid(void)   //调用进程的父进程。

uid_t   getuid(void)   //返回调用进程的实际用户ID。

uid_t   geteuid(void)   //返回用户的有效用户id

uid_t   getgid(void)      //调用进程的实际用户组ID。

gid_t    getegid(void)     //调用进程的实际组ID。

8.3fork函数

一个进程可以调用fork来创建新的进程。
pid_t    fork(void)
#include "apue.h"



int glob = 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)

        {

                glob++;

                var++;

        }else

        {sleep(2);

        }

        printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);

        exit(0);

}
运行结果:
[root@localhost apue]# ./a.out 

a write to stdout

before fork

pid = 7656, glob = 7, var = 89

pid = 7655, glob = 6, var = 88

[root@localhost apue]# ./a.out >fort.out

[root@localhost apue]# cat fort.out 

a write to stdout

before fork

pid = 7671, glob = 7, var = 89

before fork

pid = 7670, glob = 6, var = 88


 
   
父进程和子进程共享打开的文件。子进程把父进程的所有打开的文件描述符都复制到子进程中。
 
  
子进程和父进程共享一个文件表项。

8.4vfork函数

vfork函数的调用序列和返回值与fork相同。但两个语义不同。
vfork可以保证子进程的先与父进程执行。它调用exec或者exit之后父进程才可能被调度执行。
vforktest.c:
#include "apue.h"

int glob = 6;

int main()

{

        int var;

        pid_t pid;

        var = 88;

        printf("before vfork\n");

        if ((pid = vfork()) < 0){

                err_sys("vfork error");

        }else if (pid == 0){

                glob++;

                var++;

                _exit(0);

        }

        printf("pid = %d, glob = %d, var = %d\n", getpid, glob, var);

        exit(0);

}
运行结果:
[root@localhost apue]# vim vforktest.c

[root@localhost apue]# gcc vforktest.c 

[root@localhost apue]# ./a.out 

before vfork

pid = 134513812, glob = 7, var = 89

8.6wait和waitpid函数

当一个进程正常或者异常终止时,内核就向其父进程发送SIGCHLD信号。
父进程可以忽略这个信号或者调用一个执行的函数。系统默认是忽略它。
pid_t   wait(int  *statloc)
pid_t   waitpid( pid_t   pid,  int   *statloc,   int   options)
若成功返回进程ID,出错则返回-1。
下面为关于子进程退出状态的操作.
exittest.c:
#include "apue.h"

#include <sys/wait.h>



void pr_exit(int status);

int main(void)

{

        pid_t pid;

        int status;

        if ((pid = fork()) < 0)

                err_sys("error fork");

        else if (pid == 0)

                exit(7);

        if (wait(&status) != pid)

                err_sys("wait error");

        pr_exit(status);



        if ((pid = fork()) < 0)

                err_sys("error fork");

        else if (pid == 0)

                abort();

        if (wait(&status) != pid)

                err_sys("wait error");

        pr_exit(status);



        if ((pid = fork()) < 0)

                err_sys("error fork");

        else if (pid == 0)

                status /= 0;

        if (wait(&status) != pid)

                err_sys("wait error");

        pr_exit(status);



        exit(0);

}



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));

}
运行结果:
[root@localhost apue]# vim exittest.c

[root@localhost apue]# gcc exittest.c 

exittest.c: In function ‘main’:

exittest.c:28: 警告:被零除

[root@localhost apue]# ./a.out 

normal termination,exit status = 7

abnormal termination, signal number = 6

abnormal termination, signal number = 8


如果一个进程有几个子进程,name只要有一个子进程终止,wait函数就返回。
waitpid用于等待一个指定的进程终止。
pid_t   waitpid(pid_t  pid,  int   *statloc,  int   options);
如果pid = -1  等待任一进程终止,此时与wait等效。
pid > 0 等待其进程ID与pid相等的子进程。
pid  == 0  等待其组ID等于调用进程组ID的任一子进程。
pid  < -1  等待组ID等于pid绝对值得任一子进程。















 

你可能感兴趣的:(UP)