【多进程】程序设计

来源:互联网 发布:跨界歌王 巫启贤 知乎 编辑:程序博客网 时间:2024/05/16 06:02


1、获取进程ID:getpid

1)函数原型

pid_t getpid(void);

2)所属头文件

#include <sys/types.h>

#include <unistd.h>

3)返回值

一般成功: 返回调用该进程的id.

4)参数说明

无参数

#include <sys/types.h>#include <unistd.h>#include <stdio.h>void main(){int id;id = getpid();printf("Process id is %d.\n", id);}输出:[root@localhost multi-process]# ./getpid Process id is 3557.



2.0、创建进程: fork, 独立数据段和堆栈段

1)函数原型

pid_t fork(void);   //创建一个子进程, 复制父进程余下的程序, 父/子进程执行顺序不定

2)所属头文件

#include <unistd.h>

3)返回值

成功: 在父进程中返回子进程的pid

           在在进程中返回0.

失败: -1

4)参数说明

无参数


#include <stdio.h>#include <unistd.h>void main(){pid_t pid = 0;pid = fork();if (pid > 0){printf("I love linux: %d\n", pid);}else{printf("I am fork's child\n");}exit(0);  //End of process.}输出:[root@localhost multi-process]# ./myfork I love linux: 3582I am fork's child


2.1、创建进程: vfork, 共享父进程的数据段和堆栈段.

1)函数原型

pid_t vfork(void);   //创建子进程并阻塞父进程, 即子进程先运行.

2)所属头文件

#include <sys/types.h>

#include <unistd.h>

3)返回值

成功: 在父进程中返回子进程的pid

          在子进程中返回0

失败: -1

4)参数说明

无参数

#include <stdio.h>#include <sys/types.h>#include <unistd.h>void main(){pid_t pid = 0;pid = vfork();if (pid > 0){printf("I love linux: %d\n", pid);}else{printf("I am fork's child\n");}exit(0);  //End of process.}输出:[root@localhost multi-process]# ./myvfork I am fork's childI love linux: 3625




3、退出进程: exit

1)函数原型

void exit(int status);

2)所属头文件

#include <stdlib.h>

3)返回值

无返回值.

4)参数说明

status: 返回给父进程 status & 0377, 退出状态码


4、进程等待: wait

1)函数原型

pid_t wait(int *status);

2)所属头文件

#include <sys/types.h>

#include <sys/wait.h>

3)返回值

成功: 返回终止的子进程ID

失败: -1

4)参数说明

status: 记录子进程的退出状态


#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>#include <stdlib.h>void main(){pid_t pid;pid = fork();if (pid > 0){wait(NULL);puts("I am father process.\n");exit(0);}else{puts("I am child. Ha Ha ~~\n");exit(0);}}输出:[root@localhost multi-process]# ./mywait I am child. Ha Ha ~~I am father process.




5、执行进程: exec

1)函数原型

int execl(const char *path, const char *arg, ...);

2)所属头文件

#include <unistd.h>

3)返回值

成功: 无

失败: 有

4)参数说明

arg: path指向的进程需要的函数(可以有多个), 以NULL结束.



#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#include <stdlib.h>void main(){pid_t pid = 0;pid = fork();if (pid > 0){puts("Father: Hello Linux. \n");wait(NULL);exit(0);}else{execl("./getpid", NULL);/* 当执行了execl()之后, 余下的代码将不会被执行 */puts("Child: Goodbye Linux. \n");exit(0);}} 输出:[root@localhost multi-process]# ./myexec Father: Hello Linux. Process id is 3695.

* 注: 这里需要注意的是, 当执行了execl之后, 余下的代码将不会被执行.


# exec和fork的区别:

fork: 创建一个新的进程, 产生一个新的pid.

exec: 保留原有的进程, 执行新的代码.(余下代码不执行 ! )



0 0