进程的创建
使用的函数
Linux中使用C语言进行进程的创建使用fork()函数,该函数返回一个pid_t类型的值,该返回值如果为-1的话表示创建进程失败,为0的话表示子进程,大于0的话表示创建成功并且该值为子进程pid,所创建的进程是与父进程一样,执行到的位置也一样(除了fork的返回值、pid、ppid不一样,未决信号和文件锁不继承,资源利用量清零)
代码展示
下面是创建进程的代码展示:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid;
//打印当前进程的进程号和Begin!
printf("[%d]:Begin!\n",getpid());
pid = fork();
if(pid < 0){
printf("Create Fail\n");
exit(1);
}else if (pid == 0)
{
//打印子进程的进程号和Child is working
printf("[%d]:Child is working!\n",getpid());
}else{
//打印子进程的进程号和Parent is working
printf("[%d]:Parent is working!\n",getpid());
}
printf("[%d]:End!\n",getpid());
exit(0);
}
执行结果

补充
可以看到上面的执行结果是有些问题的,正确的应该是Begin!只执行一次,出错的原因是因为我当前的VSCode的终端是全缓冲机制,而在创建子线程之前我没有将所有的流刷新导致的在创建的子进程中依旧含有未刷新的数据,解决方法只需要在创建子进程之前加一句刷新流的代码即可,如下:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid;
printf("[%d]:Begin!\n",getpid());
//刷新所有流
fflush(NULL);
pid = fork();
if(pid < 0){
printf("Create Fail\n");
exit(1);
}else if (pid == 0)
{
printf("[%d]:Child is working!\n",getpid());
}else{
printf("[%d]:Parent is working!\n",getpid());
}
printf("[%d]:End!\n",getpid());
exit(0);
}
执行结果如下

进程的回收
进程的回收通过wait()和waitpid()两个函数实现,但是每次只能回收一个子进程,如果创建了多个子进程的话需要调用多次,如下:
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#define START 0
#define END 10
#define PNUM 3 //创建3个子进程执行任务
int main(){
pid_t pid;
int child_process_count = 0;
for(int n = 0 ; n < PNUM ; n++){
fflush(NULL);
pid = fork();
if(pid < 0){
//假如创建进程失败就回收之前创建的子进程,并且退出
for(int j = 0 ; j < child_process_count ; j++){
wait(NULL);
}
exit(1);
}
if(pid == 0){
for(int i = START + n;i < END ; i+=PNUM){
printf("[%d]我打印:%d\n",getpid(),i);
}
sleep(1000);
exit(0);
}else{
child_process_count++;
}
}
//最后要回收所有子进程
for(int j = 0 ; j < child_process_count ; j++){
wait(NULL);
}
exit(0);
}
具体两个参数的解释可以参考下这篇文章:https://blog.csdn.net/csdn_kou/article/details/81091191
或者是自己查看man手册(需要在Linux环境下):
$man wait
网友评论