首页 > 其他 > 详细

[APUE] 第12张习题解答

时间:2014-04-19 03:17:41      阅读:607      评论:0      收藏:0      [点我收藏+]

1 在linux系统中运行12-7中的程序,但把结果重定向到文件中,解释结果。

下面是12-7的代码:

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;

void prepare()
{
	printf("preparing locks\n");
	pthread_mutex_lock(&lock1);
	pthread_mutex_lock(&lock2);
}

void parent()
{
	printf("parent unlocking locks\n");
	pthread_mutex_unlock(&lock1);
	pthread_mutex_unlock(&lock2);
}

void child()
{
	printf("child unlocking locks\n");
	pthread_mutex_unlock(&lock1);
	pthread_mutex_unlock(&lock2);
}

void *thr_fn(void *arg)
{
	printf("thread started\n");
	pause();
	return 0;
}

int main(int argc, char const *argv[])
{
	int err;
	pid_t pid;
	pthread_t tid;

	if((err = pthread_atfork(prepare, parent, child)) != 0) {
		printf("can‘t install fork handlers\n");
	}
	if((err = pthread_create(&tid, NULL, thr_fn, 0)) != 0) {
		printf("can‘t create thread\n");
	}
	sleep(2);
	printf("parent about to fork\n");
	if((pid = fork()) < 0) {
		printf("fork failed\n");
	}
	else if(pid == 0) {
		printf("child returned from fork\n");
	}
	else {
		printf("parent returned from fork\n");
	}

	return 0;
}

运行时将结果重定向到文件,结果是:

thread started
parent about to fork
preparing locks
parent unlocking locks
parent returned from fork
thread started
parent about to fork
preparing locks
child unlocking locks
child returned from fork

部分结果出现了两次,这是因为缓冲区的缘故。如果输出到终端,由于终端是行缓冲的,因此,输出一行就会直接输出到终端,但是,文件是全缓冲的,因此,只有当缓冲区满或者进程结束时,缓冲区中的内容才会输出到文件中。在fork()之前,创建了线程,由于线程共享缓冲区,线程的printf也会输出到当前进程的缓冲区,因此,在fork()之前,缓冲区中的内容有:

thread started
parent about to fork

然后,调用fork(),首先会调用prepare(),由于还是在父进程中,因此,缓冲区中的内容变成了:

thread started
parent about to fork
preparing locks

接着创建子进程,然后,会调用parent(),由于parent()会修改父进程的东西,因此,在调用parent()之前,会进行写时拷贝,拷贝缓冲区到子进程中,那么,此时父子进程缓冲区都是:

thread started
parent about to fork
preparing locks

然后,在父进程地址空间中调用parent(),返回到父进程,在子进程地址空间中调用child(),返回到子进程,父子进程分别执行之后缓冲区分别是:
//父进程的缓冲区中的内容
thread started
parent about to fork
preparing locks
parent unlocking locks
parent returned from fork

//子进程的缓冲区中的内容
thread started
parent about to fork
preparing locks
child unlocking locks
child returned from fork

等两个进程结束后就会输出到文件了,结果如开始所示。

从这个结果也可以看出,fork()产生一个进程后,确实返回两次,先返回到父进程,再返回到子进程。


其它题目现在看不太懂,待补充。。。

[APUE] 第12张习题解答,布布扣,bubuko.com

[APUE] 第12张习题解答

原文:http://blog.csdn.net/luofengmacheng/article/details/24020293

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!