linux fork与sleep的一些使用误区

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的改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值