linux 系统编程 fork

版权声明:本文为作者创作,转载请注明出处: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;
}

猜你喜欢

转载自blog.csdn.net/claroja/article/details/89088068