进程控制-创建子进程
来源:互联网 发布:长城三公主知乎 编辑:程序博客网 时间:2024/05/01 16:32
如果进程是一辆车,那么至少有启动,运行,停止三种状态。不过,进程和车最大的不同是,进程是可以自我复制的,只要使用函数fork就可以像孙悟空一样再变出一个自己。不过世界上没有两个完全一样的东西,变出来的这个进程,拥有属于自己的ID号(pid),自己的年龄(运行时间)。这些都与父进程不同。
kill 5013
通过getpid进程这辆车还可以获取自己的车牌号,getppid可以获取父进程的pid。
那么父进程不可以获取子进程的pid呢?只有通过fork的返回值了。
#include<sys/types.h>//pid_t 这个类型是定义这个头文件里面的//./usr/include/sys/types.h#include<stdio.h>int main(){ pid_t pid; pid = fork(); //fork从子进程和父进程都有一个返回值 //他在子进程中返回一个0 //在父进程中返回子进程的pid if(pid<0) { printf("fork error!\n"); exit(1); } else if(pid==0) { printf("我是子进程!PID=[%d] PPID=[%d] \n",getpid(),getppid()); }else { printf("我是父进程!PID=[%d] PPID=[%d] \n",getpid(),getppid()); } //getpid()获取本进程的PID //getppid()获取本进程的父进程(parent)的PID exit(0);}
例2
#include<sys/types.h>#include<stdio.h>#include<fcntl.h>//这个头文件包含了操作file的函数int main(){ int fd = open("tmp.txt",O_RDWR);//以读写方式打开 if(fd < 0) { printf("打开文件失败\n"); } pid_t pid; pid = fork(); if(pid<0) { printf("fork error!\n"); exit(1); } else if(pid==0)//子进程追加内容 { char string_tmp[10]="012345678"; write(fd,string_tmp,strlen(string_tmp)); }else//父进程文件偏移 { if(lseek(fd,0L,2)<0) { printf("文件偏移失败\n"); exit(1); } } close(fd); exit(0);}
僵尸进程
父进程还没结束,子进程就执行完了,但是父进程没有回收子进程的资源,这个时候,子进程就成了僵尸进程(他的生命已结束,但是还挂在那里)。
[back@dd ~]$ ps -ef|grep a.outback 5013 3257 0 06:44 pts/0 00:00:00 ./a.outback 5014 5013 0 06:44 pts/0 00:00:00 [a.out] <defunct>back 5016 4987 0 06:45 pts/1 00:00:00 grep --color=auto a.out
kill 5013
wait可以预防僵尸进程的发生
#include<sys/types.h>#include<stdio.h>int main(){ pid_t pid; pid = fork(); if(pid < 0) { printf("创建子进程失败"); }else if(pid>0) { wait(0);//解决办法:wait可以让父进程回收子进程的资源 while(1)//让父进程一直循环 { sleep(1); } }else { printf("子进程开始执行\n"); printf("子进程结束执行\n"); exit(1); } return 0;}
孤儿进程,父进程结束,子进程还在运行,会被init收养。
#include<sys/types.h>#include<stdio.h>int main(){ pid_t pid; pid = fork(); if(pid < 0) { printf("创建子进程失败"); }else if(pid>0) { sleep(3);//休息一下 printf("child pid:%d,ppid:%d\n",getpid(),getppid()); exit(1); }else { printf("child pid:%d,ppid:%d\n",getpid(),getppid()); } sleep(7);//休息一下 printf("child pid:%d,ppid:%d\n",getpid(),getppid()); return 0;}
0 0
- 进程控制-创建子进程
- 创建子进程控制句柄继承能力
- 创建子进程
- 创建子进程
- windows 创建子进程
- fork创建子进程
- 创建子进程函数
- 子进程的创建
- 子进程的创建
- fork创建子进程
- fork创建子进程
- python创建子进程
- linux 创建子进程
- Linux子进程创建
- 子进程创建do_fork
- fork()创建子进程
- 进程控制(上):进程创建,进程等待,进程终止
- 父进程为什么要创建子进程
- mark一下:csdn博客访问量约100万, 积分约2万, 评论约1000条, 排名约200
- 一、排序(时间复杂度 O(n^2))
- StarUML2 建模工具全平台破解及license验证简要分析
- dcm4che2.0.29版本 ----- DicomImageReadParam
- 资源收集
- 进程控制-创建子进程
- 分享一个网页背景图与div居中的方法
- leetcode217---Contains Duplicate(是否有重复数)
- 开始写博客,毕业一年的收获
- TBD socket client请求,在向远端ip:port发送时,会随机找个本地可用端口去向远端ip:port 发起net io write操作。远端accept后的sockets都共享一个端口
- HDU【1875】A strange lift
- 情怀之下,唯张小龙一人而
- 计算结构体偏移量
- Fragment