测试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]#
相关文章推荐
- python 读取mysql 查询结果值标准输出
- Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串
- webbench的使用以及输出结果中Speed pages/minbytes/sec的含义
- linux 标准输出、标准错误输出、以及shell小技巧
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 标准盲打手势,10次测试,每次使用不同文章,测试一分钟的结果
- 如何将Action中的Hibernate查询结果LIST输出在控制台以及JSP界面
- Tpc-ds测试以及结果
- selenium+python关于登录的脚本代码,使用了读取excel以及向excel中写入测试结果的方法
- kshell 标准输入输出 >(重新输出) >>(追加输出) 以及2>(标准错误输出)以及输出重定向/dev/null
- 12.iOS格式化日志输出的方法以及在发布状态自动关闭NSLog方法
- 结果同时标准输出,并且写入文件
- 习题 7.9 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格、和其他字符的个数,在主函数中输入字符串以及输出上述的结果。
- select和poll程序测试以及结果分析
- Sysbench 进行磁盘IO测试的输出结果解读
- java.io.Console的使用以及重定向标准输出/输入
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
- 结果同时标准输出,并且写入文件