Linux论坛's Archiver

《开源》旗舰电子杂志2008年11期发布,火热下载中!

fangshenghao 发表于 2008-5-4 13:08

dup2 如何使用

请问一下 dup2 如何使用的, 查了好多资料, 始终不明白参数是如何传递的.
我想要把下面的程序通过dup2来实现, 能不能帮我看一下

[table=95%][tr][td][font=FixedSys][color=#000000][color=#FF9900]/*------------------------*/[/color]
[color=#FF9900]/* pipe3.c*/[/color]

[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]unistd[color=#0000CC].[/color]h[color=#0000CC]>[/color]
[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]stdlib[color=#0000CC].[/color]h[color=#0000CC]>[/color]
[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]stdio[color=#0000CC].[/color]h[color=#0000CC]>[/color]
[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]pthread[color=#0000CC].[/color]h[color=#0000CC]>[/color]

[color=#0000FF]int[/color] main[color=#0000CC]([/color][color=#0000CC])[/color]
[color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]int[/color] data_processed[color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]int[/color] file_pipes[color=#0000CC][[/color]2[color=#0000CC]][/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]const[/color] [color=#0000FF]char[/color] some_data[color=#0000CC][[/color][color=#0000CC]][/color][color=#0000CC]=[/color][color=#FF00FF]"123"[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]char[/color] buffer[color=#0000CC][[/color]BUFSIZ[color=#0000CC]+[/color]1[color=#0000CC]][/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]pid_t[/color] fork_result[color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]memset[/color][color=#0000CC]([/color]buffer[color=#0000CC],[/color] [color=#FF00FF]'\0'[/color][color=#0000CC],[/color] [color=#0000FF]sizeof[/color][color=#0000CC]([/color]buffer[color=#0000CC])[/color][color=#0000CC])[/color][color=#0000CC];[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]if[/color][color=#0000CC]([/color]pipe[color=#0000CC]([/color]file_pipes[color=#0000CC])[/color] [color=#0000CC]=[/color][color=#0000CC]=[/color] 0[color=#0000CC])[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fork_result [color=#0000CC]=[/color] fork[color=#0000CC]([/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]if[/color][color=#0000CC]([/color]fork_result [color=#0000CC]=[/color][color=#0000CC]=[/color] [color=#0000CC]-[/color]1[color=#0000CC])[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]fprintf[/color][color=#0000CC]([/color][color=#FF0000]stderr[/color][color=#0000CC],[/color] [color=#FF00FF]"Fork failure"[/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]exit[/color][color=#0000CC]([/color][color=#FF0000]EXIT_FAILURE[/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]}[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]if[/color][color=#0000CC]([/color]fork_result [color=#0000CC]=[/color][color=#0000CC]=[/color] 0[color=#0000CC])[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]sprintf[/color][color=#0000CC]([/color]buffer[color=#0000CC],[/color] [color=#FF00FF]"%d"[/color][color=#0000CC],[/color] file_pipes[color=#0000CC][[/color]0[color=#0000CC]][/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]([/color][color=#0000FF]void[/color][color=#0000CC])[/color]execl[color=#0000CC]([/color][color=#FF00FF]"pipe4"[/color][color=#0000CC],[/color][color=#FF00FF]"pipe4"[/color][color=#0000CC],[/color] buffer[color=#0000CC],[/color] [color=#0000CC]([/color][color=#0000FF]char[/color][color=#0000CC]*[/color][color=#0000CC])[/color]0[color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]exit[/color][color=#0000CC]([/color][color=#FF0000]EXIT_FAILURE[/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]}[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]else[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_processed [color=#0000CC]=[/color] [color=#FF0000]write[/color][color=#0000CC]([/color]file_pipes[color=#0000CC][[/color]1[color=#0000CC]][/color][color=#0000CC],[/color] some_data[color=#0000CC],[/color] [color=#FF0000]strlen[/color][color=#0000CC]([/color]some_data[color=#0000CC])[/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]printf[/color][color=#0000CC]([/color][color=#FF00FF]"%d - wrote %d bytes\n"[/color][color=#0000CC],[/color] [color=#0000CC]([/color][color=#0000FF]int[/color][color=#0000CC])[/color]getpid[color=#0000CC]([/color][color=#0000CC])[/color][color=#0000CC],[/color] data_processed[color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]}[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]}[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]exit[/color][color=#0000CC]([/color][color=#FF0000]EXIT_SUCCESS[/color][color=#0000CC])[/color][color=#0000CC];[/color]
[color=#0000CC]}[/color]
[/color][/font][/td][/tr][/table]
[table=95%][tr][td][font=FixedSys][color=#000000][color=#FF9900]/*  pipe4  */[/color]

[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]unistd[color=#0000CC].[/color]h[color=#0000CC]>[/color]
[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]stdlib[color=#0000CC].[/color]h[color=#0000CC]>[/color]
[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]stdio[color=#0000CC].[/color]h[color=#0000CC]>[/color]
[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color][color=#FF0000]string[/color][color=#0000CC].[/color]h[color=#0000CC]>[/color]

[color=#0000FF]int[/color] main[color=#0000CC]([/color][color=#0000FF]int[/color] argc[color=#0000CC],[/color] [color=#0000FF]char[/color] [color=#0000CC]*[/color]argv[color=#0000CC][[/color][color=#0000CC]][/color][color=#0000CC])[/color]
[color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]int[/color] data_processed[color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]char[/color] buffer[color=#0000CC][[/color]BUFSIZ [color=#0000CC]+[/color]1[color=#0000CC]][/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]int[/color] file_descriptor[color=#0000CC];[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]memset[/color][color=#0000CC]([/color]buffer[color=#0000CC],[/color] [color=#FF00FF]'\0'[/color][color=#0000CC],[/color] [color=#0000FF]sizeof[/color][color=#0000CC]([/color]buffer[color=#0000CC])[/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]sscanf[/color][color=#0000CC]([/color]argv[color=#0000CC][[/color]1[color=#0000CC]][/color][color=#0000CC],[/color] [color=#FF00FF]"%d"[/color][color=#0000CC],[/color] [color=#0000CC]&[/color]file_descriptor[color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;data_processed [color=#0000CC]=[/color] [color=#FF0000]read[/color][color=#0000CC]([/color]file_descriptor[color=#0000CC],[/color] buffer[color=#0000CC],[/color] BUFSIZ[color=#0000CC])[/color][color=#0000CC];[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]printf[/color][color=#0000CC]([/color][color=#FF00FF]"%d - read %d bytes: %s\n"[/color][color=#0000CC],[/color] getpid[color=#0000CC]([/color][color=#0000CC])[/color][color=#0000CC],[/color] data_processed[color=#0000CC],[/color] buffer[color=#0000CC])[/color][color=#0000CC];[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]exit[/color][color=#0000CC]([/color][color=#FF0000]EXIT_SUCCESS[/color][color=#0000CC])[/color][color=#0000CC];[/color]
[color=#0000CC]}[/color]
[/color][/font][/td][/tr][/table]

输出:
$ ./pipe3
980 - wrote 3 bytes
981 - read 3 bytes: 123

程序pipe3中调用pipe4, 我想知道如果用 dup2来实现是怎么改的.

cugbcat 发表于 2008-5-4 14:18

参考APUE中的例子。

fangshenghao 发表于 2008-5-4 14:23

APUE?

linuxpk 发表于 2008-5-4 14:57

APUE
Advanced Programming Unix Environment
Unix环境高级编程,经典书籍,本论坛“资源下载”板块就有下载,同时也建议购买一本,终身受用!

cugbcat 发表于 2008-5-4 15:11

[quote]原帖由 [i]linuxpk[/i] 于 2008-5-4 14:57 发表 [url=http://bbs.linuxpk.com/redirect.php?goto=findpost&pid=49156&ptid=14214][img]http://bbs.linuxpk.com/images/common/back.gif[/img][/url]
APUE
Advanced Programming Unix Environment
Unix环境高级编程,经典书籍,本论坛“资源下载”板块就有下载,同时也建议购买一本,终身受用! [/quote]
就是他:lol :lol

brace 发表于 2008-5-19 13:41

dup2简单的说,就是使用第二个fd,来重定向第一个fd.

tracydundun 发表于 2008-5-21 11:43

[url]http://www.linuxpk.com/37747/viewspace-11403.html[/url]
看一下这的介绍

Flyinmorning 发表于 2008-5-22 11:32

请问搂主,你的代码怎么拷贝出彩色的来的啊?
很重要

[[i] 本帖最后由 Flyinmorning 于 2008-5-22 11:38 编辑 [/i]]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.