fork与sleep
fork是从当前开始创建一个子进程,返回进程的pid
sleep是挂起当前的进程
此文限于你对fork与sleep有一定的理解,但是无法达到你想要的效果
如果你是想从零开始学习这些,推荐去找一个更为详细的教程,当你发现没法实现多线程的时候,再来我这看看
使用误区
看看下面的代码,就是实现父进程输出一行和子进程输出一行,很简单的代码
不过我用了一个change变量来控制父子进程执行顺序,实际上不需要这个也能实现,但这就达不到笔者的教学目的了。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid;
printf("create pipe success\n");
pid = fork();
if (pid == 0) { // child process code
printf("this is child\n");
sleep(1);
while(change == 0);
printf("this is child\n");
}
else if (pid > 0) { // parent process code
printf("this is parent process\n");
change = 1;
sleep(1);
}
return 0;
}
误区1 sleep
sleep确实是挂起进程,但需要注意linux的sleep与windows下的sleep是两个不同的函数。
不只是大小写的区别,还有参数,sleep中参数单位是秒,而windows下是毫秒。
如果你写了一个sleep(1000)想要达到一个挂起1秒,先执行另一个进程的效果,那么你就会发现这个进程迟迟不能执行到后面。
误区2 父进程的终止 孤儿进程
了解了sleep后,你在子进程中加了一个sleep,休眠了5秒,此时你会发现你还是没办法执行子进程接下来的代码
对于一个简单的父进程,5秒已经执行完毕,父进程执行完之后子进程会被init接管为子进程,如此后面就无法执行到后面了。
所以上面的代码,笔者在父进程中也加了一个sleep,还有一个做法是在return终止之前加一个死循环不让父进程终止。
误区3 进程间不共享全局变量
线程间是共享全局变量的,但是进程间是不共享的
如果想要将change作为全局变量,得到控制进程执行的效果,那是不可行的
而上述代码中的change实际上也是没有作用的,子进程不清楚父进程对于change的改变。