Linux学习2-fork

复制进程映像 fork()

要想让进程同时执行多个函数,咱们能够使用线程或从源程序中建立一个彻底分离的进程,后者就像init的作法同样,而不像exec调用那样用新程序替换当前指向的线程。函数

咱们能够经过调用fork建立一个新进程。这个系统调用复制当前进程,在进程表中建立一个新的表项,新表项中许多属性和当前进程是相同的。this

新进程几乎和原进程如出一辙,执行的代码也所有同样,但新进程有本身的数据空间,环境和文件描述符。spa

fork和exec函数结合使用就是建立新进程所须要的一切了。线程

#include<sys/type.h>设计

#include<unistd.h>3d

pid_t fork(void);指针

 在父进程中调用返回的是新的子进程的PID。新进程进继续执行,不过子进程中fork返回的是0.父子进程能够经过这一点来判断谁是父子。code

若是fork失败返回-1,一般是由于父进程所拥有的子进程数目超过规定限制。orm

 fork1.c    blog

#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    pid_t pid;
    char *message;
    int n;
    
    printf("fork program starting!\n");
    pid = fork();
    switch(pid)
    {
        case -1:
            perror("fork failed!");
            exit(1);
        case 0:
          message = "this is child";
            n = 5;
             break;
        default :
        message = "this is parenet";
            n = 2;
            break;          
    }

    for(;n>0;n--)
    {
         puts(message);
         sleep(1);
    }
    exit(0);
}

 

 

等待一个进程

当用fork启动一个子进程时,紫禁城就有了本身的生命周期并将独立运行。咱们能够经过在父进程中调用wait函数让父进程等待子进程的结束。

#include<sys/types.h>

#inlcude<sys/wait.h>

pid_t wait(int *stat_loc);

wait系统调用将暂停父进程知道他的子进程结束为止。这个调用返回子进程的PID,它一般是已经结束运行的子进程的PID。状态信息容许父进程了解子进程的退出状态,及

子进程main函数的返回值或子进程中exit函数的退出码。若是stat_loc不是空指针,状态信息将被写入它所指向的位置。

咱们能够经过sys/wait.h文件中定义的宏来解释状态信息。

wait.c

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    pid_t pid;
    char *message;
    int n;
    int exit_code;
    printf("fork program starting!\n");
    pid = fork();
    if (pid < 0)
    {
        printf("this is fork error!\n");
        exit(1);
    }else if(pid == 0)
    {
        printf("this is child!\n");
        message = "child";
        n = 5;
        exit_code = 37; 
    }else
    {
        printf("this is parent!\n");
        n = 3;
        message = "parent";
        exit_code = 0;
    }
    for(;n>0;n--)
    {
        puts(message);
        sleep(1);
    }
//程序这一部分等待子进程完成。
if (pid != 0) { int stat_val; pid_t child_pid; child_pid = wait(&stat_val); printf("child has finished:pid=%d\n",child_pid); printf("this stat_val is :%d\n",stat_val);
//若是子进程正常结束,它就取一个非零值
if
(WIFEXITED(stat_val)) { //若是WIFEXITED非零,则返回子进程的退出码
printf(
"child exited with code %d\n",WEXITSTATUS(stat_val)); }

else { printf("child terminated abnormally\n"); } } exit(exit_code); }

 

 

 

 

 以上内容来自《Linux程序设计第四版》

相关文章
相关标签/搜索