测试v_fork以及关闭标准输出后输出结果

#include "apue.h"
#include <fcntl.h>
int glob = 6;

/*
 * 测试v_fork的例子,v_fork创建的子进程, 在父进程的空间里面执行, 而v_fork的父进程, 则会等待子进程运行完毕后执行。
 * 而fork创建的子进程,则会复制你进程的空间, 分别在各自空间运行,互不影响, 而父子进程谁先运行完,不确定。
 *
 */

int main(void) {
	int var;
	pid_t pid;
	var = 88;

	if (1 > 0) {
		printf("1>0\n");
	} else if (2 > 1)
		printf("2>1\n");
	else
		printf("else\n");
	/*
	 * 普通的if, else if , else 只是从最开始判断, 一个成功后, 另外挂分支就不会去测了
	 * 而vfork的fork的if, else if , else, 则会走两个分支,因为他们有两个返回值,
	 * 而下例中, pid >1 的分支, 则不会走到, 而只走了pid ==0 和 pid > 0这一段
	 * 程序中 else if(pid ==0)这里, 用_exit(0)相当巧妙, 这样就不会关闭标准IO和执行
	 * 测试的操作系统中,调用exit(0)仍然会有输出pid = %d这段, 没有关闭IO
	 */

	printf("before vfork\n");
	if ((pid = vfork()) < 0) {
		err_sys("vfork error");
	} else if (pid == 0) {
		glob++;
		var++;
		// _exit(0);
//		fclose(stdout);
		exit(0);
	} else if (pid > 0) {
		printf("this line can also be output\n");
	} else if (pid > 1)
		printf("pid > 1 after pid >0 can output\n");
	printf("before fclose(stdout) , pid = %d, glob = %d, var = %d\n", getpid(),
			glob, var);
	fclose(stdout);
	/*
	 * 如果文件已经存在,则flag值为 O_RDWR | O_CREAT | O_EXCL 或 O_RDWR | O_EXCL | O_CREAT 都会报错
	 * 而书上说,O_EXCL, O_CREAT组成原子操作, 即使文件存在,也不报错。只有O_CREAT存在时, 第三个参数才有用。
	 */
	char buf[10] = { '\0' };
	int file;
	if ((file = open("a.txt", O_RDWR | O_TRUNC, S_IRWXU | S_IRWXG)) == -1) {
		err_sys("Open file Error!\n");
	}
	printf("sizeof(buf) = %d, file = %d\n", sizeof(buf), file);
	/*
	 * sizeof(buf)的值,是10, 而file是文件编号
	 * 如果fclose(stdout)后, 则printf会输出失败,返回0, 如果输出成功, 将返回输出字节数。
	 * buf需要初始化, 不然, 如果你只输入一个1在里面,那么输出1后, 后面会接一段乱码
	 * 虽然result的值是以%d的形式输进去的, 但他在buf里面,占用两个字节"-1", 而如果result的值为1的话,当然只占一字节了。
	 * buf的长度只有10char, 如果输进去多了的话,只有前面的10个char进入了buf, 而不会报错。
	 */
	int result = printf(
			"before fclose(stdout) , pid = %d, glob = %d, var = %d\n", getpid(),
			glob, var);
	sprintf(buf, "ab%d%dabcdefg", result, sizeof(buf));
//	printf("buf = %s\n", buf);
	write(file, buf, sizeof(buf));

	close(file);

	exit(0);
}

输出结果:

[root@SUCRE-PC src]# ./test 
1>0
before vfork
this line can also be output
before fclose(stdout) , pid = 8691, glob = 7, var = 89
[root@SUCRE-PC src]# cat a.txt
ab-110abcd[root@SUCRE-PC src]# 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值