您的位置:首页 > 运维架构 > Linux

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

2013-06-14 17:16 399 查看
#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]#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux C 编程
相关文章推荐