版权声明:本文为作者创作,转载请注明出处:http://blog.csdn.net/claroja,如有商业用途请联系QQ:63183535。 https://blog.csdn.net/claroja/article/details/89088068
pid_t fork(void);
返回值:
失败 -1
成功,两次返回
父进程返回子进程id
子进程返回 0
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);//获得当前进程的id
pid_t getppid(void);//获得父进程的id
父子相同处: 全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式…
父子不同处: 1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集
父子进程间遵循读时共享写时复制的原则。
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(){
printf("start");
pid_t pid = fork();
printf("end")
return 0;
start打印两次
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int var = 34;
int main(void)
{
pid_t pid;
pid = fork();//从这里开始,子进程复制了下面的代码,单独运行,在子进程里pid是0,在父进程里pid是子进程的id
if (pid == -1 ) {//如果失败的话
perror("fork error");
exit(1);
} else if (pid > 0) {//父进程会执行这里
sleep(2);//等待子进程的结束,不然子进程会没有父进程
var = 55;//子进程和父进程不共享全局变量
printf("I'm parent pid = %d, parentID = %d, var = %d\n", getpid(), getppid(), var);
} else if (pid == 0) {//子进程会执行这里
var = 100;
printf("child pid = %d, parentID=%d, var = %d\n", getpid(), getppid(), var);
}
printf("var = %d\n", var);
return 0;
}
ps aux
查看进程信息
ps ajx
可以查看进程之间的关系
kill
给进程发送一个信号,SIGKILL 9
创建多个子进程
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n = 5, i;
for (i = 0; i < n; i++) //出口1,父进程出口
if (fork() == 0)
break; //出口2,子进程出口,i不自增,子进程不能创建孙进程
if (n == i) {
sleep(n);
printf("父进程, pid = %d\n", getpid());
} else {
sleep(i);
printf("I'm %dth 子进程, pid = %d\n",
i+1, getpid());
}
return 0;
}