本文主要内容为Linux系统下进程的产生方式

1.学习进程的产生方式之前首先要明白进程号的概念

    每个进程在初始化的时候,系统都分配了一个ID号,用于表示该进程,进程号的获取方法为调用函数getpid()或getppid()

1.1getpid()  返回当前进程的ID号

#include<stdio.h>

#include<unistd>

pid_t getpid(void);

1.2.getppid()返回当前进程的父进程的ID号

        #include<stdio.h>

#include<unistd>

                pid_t getppid(void);

        1.3.getpid()和getppid()函数的使用方法

                #include<stdio.h>

                #include<sys/types.h>

                #include<unistd.h>

                int main(){

                    pid_t pid,ppid;

                    printf("当前进程ID号为:%d\n",getpid());

                    printf("当前进程的父进程ID号为:%d\n",getppid());

                    return 0;

 

进程的产生的方式有:进程复制fork(),system()方式,exec()函数系列 ,本文主要讲,fork()、和system()两只方式。exec()函数系列将放在其他文章中讲解。              }


2.进程复制fork():

    fork函数以父进程为蓝本复制一个进程,ID号和父进程的ID号不同。只有内存等与父进程不同,其他与进程共享,只有在父进程或子进程进行了修改后,才重生一份

2.1.fork()函数

#include<sys/types.h>

#include<unistd.h>

pid_t fork(void);

            特别注意fork()执行一次返回两次,父进程中返回的是子进程的id号,而子进程中返回的是0

2.2.fork()函数的例子

#include<stdio.h>

#include<stdlib.h>

#include<sys/types.h>

#include<unistd.h>


int main(void){

pid_t pid;


pid = fork();


if(pid == -1){

printf("子进程产生错误");

return -1;

}else if(pid == 0){

printf("子进程,fork返回值:%d,ID:%d,父进程:ID%d\n",pid,getpid(),getppid());

return 0;

}else{

printf("父进程,fork返回值:%d,ID:%d,父进程ID:%d\n",pid,getpid(),getppid());

}

return 0;

}

 本人机子上的执行结果:

        ]# ./fork.o 

            父进程,fork返回值:2894,ID:2893,父进程ID:2778

            子进程,fork返回值:0,ID:2894,父进程:ID1

从执行的结果看以看出,父进程的返回值和子进程的ID正好相等。


3 system()函数的方式

    3.1.system()函数介绍

system()是调用shell中的外部命令,在当前进程中开始另外一个进。

调用system()函数时,会调用fork()、execve()、waitpid()等函数,其中任意个失败,将导致system()函数调用失败

函数原型:

    #include<stdlibh>

    #include<const char *command>

*当调用失败返回-1;

*当sh不能执行时,返回127

*调用成功返回进程状态值

    3.2 system()函数的执行的例子

            #include<stdio.h>

            #include<unistd.h>

            #include<stdlib.h>

            int main(){

                int ret;

                

                printf("当前进程ID号为:%d\n",getpid());

                ret = system("ping www.baidu.com -c 2");                //system()函调用

的时是/bin/sh—c command

                printf("返回的值为:%d\n",ret);


            return 0;

            }

exec()函数系列在其他的文章中在给出,本人菜鸟,初来博客。写文章是为了总结整理学过的内容,加深理解,巩固记忆,同时与大家交流学习,自知文章有很多的不足之处,希望广大读者能指出错误,提出建议,本人一定感激不尽。