以下内容仅作为个人记录的参考,但也欢迎读者前来指正。

fork()

#include<sys/types.h>
#include<unistd.h>

pid_t fork(void)

返回:
-1:出错。
0:子进程
否则为父进程。
#include<stdio.h>

#include<sys/types.h>
#include<unistd.h>

int main()
{
        pid_t result;
        result = fork();
        if(result==-1)
        {
                printf("fork出错\n");
                return 0;
        }
        else if(result==0)
        {
                printf("this is child process. pid = %d\n.",getpid());
                printf("my father's pid = %d\n",getppid());
        }
        else
        {
                printf("this is parent process.pid = %d\n.",getpid());
        }
        return 0;
}

Linux下进程控制相关_#include

 

 为什么父进程的id不是25905呢,有点奇怪。

这就是不正常的情况,父进程pid变了,说明原来的父亲没了。没了,在这里看来只能是运行结束了。

所以延长一下父进程的进程时间。

#include<stdio.h>

#include<sys/types.h>
#include<unistd.h>

int main()
{
        pid_t result;
        result = fork();
        if(result==-1)
        {
                printf("fork出错\n");
                return 0;
        }
        else if(result==0)
        {
                printf("this is child process. pid = %d\n.",getpid());
                printf("my father's pid = %d\n",getppid());
                printf("add a line to print.\n");
        }
        else
        {
                printf("this is parent process.pid = %d\n.",getpid());
                printf("the result is %d\n",result);
                printf("add a line to print.\n");
                printf("add a line to print1.\n");
                getchar();//阻塞输出
        }
        return 0;
}

Linux下进程控制相关_#include_02

 

 果然,父进程结束太快,所以儿子被别人收养了。

那么,刚才pid为1的又是什么进程呢。

Linux下进程控制相关_子进程_03

 不太清楚,可能就是单纯被某个系统进程收养了吧。

可以参考此篇博文。

https://blog.csdn.net/Oerror_/article/details/104361264

退出进程:

#include<stdlib.h>
exit(0)

#include<unistd.h>
_exit(0)

一般填0代表正常退出。

区别在于exit会对缓冲区做一些操作。
比如输出缓冲区的内容。
#include<stdio.h>

#include<sys/types.h>
#include<unistd.h>

int main()
{
        pid_t result;
        result = fork();
        if(result==-1)
        {
                printf("fork出错\n");
                return 0;
        }
        else if(result==0)
        {
                printf("子进程调用exit(0)\n");
                printf("this is a test line.");
                _exit(0);
        }
        else
        {
                printf("父进程调用exit(0)\n");
                printf("this is a test line.");
                exit(0);
        }
        return 0;
}

Linux下进程控制相关_系统进程_04

 

 区别就在于,_exit(0)比exit(0)少输出了一些内容。

 

waitpid(),这里就略掉wait()了。

Linux下进程控制相关_c函数_05

 

 

#include<stdio.h>

#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
        pid_t result;
        result = fork();
        if(result==-1)
        {
                printf("fork出错\n");
                return 0;
        }
        else if(result==0)
        {
          printf("i am child. my pid is %d.\n",getpid()); sleep(
5); exit(0); } else { pid_t pr; do{ pr = waitpid(result,NULL,WNOHANG); if(pr==0) { printf("the child process has not exited.\n"); sleep(1); } } while(pr==0); if(pr==result) { printf("the child pid is %d\n",pr); } else { printf("error occured.\n"); } } return 0; }

Linux下进程控制相关_c函数_06

 

此外,也并不是简单的父进程就输出5遍,还可能因为执行速度执行6遍。

 

还有一个创建进程的就是exec函数族。

Linux下进程控制相关_系统进程_07

 Linux下进程控制相关_#include_08

 

Linux下进程控制相关_父进程_09