Q: æ使ç¨äºå¦ä¸ä»£ç å°stdinãstdoutãstderréå®åå°/dev/null
freopen( "/dev/null", "w", stdout );
freopen( "/dev/null", "w", stderr );
freopen( "/dev/null", "r", stdin );
è¿æ ·åæ£ç¡®åï¼æ¯å¦ä½¿ç¨"w+"æè
"a"æ´æ£ç¡®ä¸äºãå¨å¾å¤ä»£ç ä¸æ¯è¿æ ·å®æéå®
åç:
close( 0 );
close( 1 );
close( 2 );
open( "/dev/null", O_RDWR );
dup( 0 );
dup( 0 );
è¿ä¸¤ç§æ¹å¼ä¸åªä¸ç§æ´å¥½ãæ´å
·å¯ç§»æ¤æ§ã
A: Andrew Gierth <
[email protected]>
第ä¸ç§æ¹å¼ä¸æ¯æ»è½è¾¾å°ç®çãfreopen()并ä¸ç¡®ä¿æ°çæ件æµæ述符ä¸å®éç¨åºå±
åææ件å¥æãåå¦æªè½éç¨ï¼åstderræµè¾åºçæ åI/Oå½æ°æç»è¾åºå°/dev/nullï¼
ä½é£äºåSTDERR_FILENOå¥æè¾åºçæ åI/Oå½æ°å°±æ²¡è¿ä¹å¹¸è¿äºï¼å¯è½è¾åºå°ä¸äºä¸
å¯é¢æçæ件ä¸å»ãæ¢å¥è¯è¯´ï¼2å·å¥ææ¤æ¶ä¸åæ¯æ åé误è¾åºäºãæ¯å¦:
write( 2, ... )
è¿æ ·çè°ç¨åå¨å®å
¨é®é¢ã第äºç§æ¹å¼å¯ä»¥é¿å
ä¸è¿°é®é¢ï¼ç¶èåå¨ç«äºç¯å¢é®é¢ã
ç°å¨çä¸è¿°ä»£ç :
--------------------------------------------------------------------------
int fd = open( "/dev/null", O_RDWR );
/*
* handle failure of open() somehow
*/
dup2( fd, 0 );
dup2( fd, 1 );
dup2( fd, 2 );
if ( fd > 2 )
{
close( fd );
}
--------------------------------------------------------------------------
ä¸ç¬¬äºç§æ¹å¼ç¸æ¯ï¼è¿ç§ä»£ç æ¯çº¿ç¨å®å
¨çã
æ人认为对äºåå°å®æ¤è¿ç¨åæ¤ç±»éå®åæä½æµªè´¹èµæºï¼å»ºè®®ç´æ¥å
³é0ã1ã2å·å¥
ææåï¼è¿æ¯é常ä¸æ£ç¡®çãå设å®ä»¬ç¡®å®è¢«å
³éäºï¼åä¸äºæ®éæ°æ®æ件å¥æå°ç
äº0ã1ã2ã以2å·å¥æ为ä¾ï¼æäºåºå½æ°å¤±è´¥åä¼å2å·å¥æè¾åºé误信æ¯ï¼è¿å°ç ´
ååææ°æ®ã
D: å°å <
[email protected]> 2002-04-25 16:47
2å·å¥æçæ¤ç±»å®å
¨é®é¢å¨2002å¹´4æ23æ¥å¾å°äºå®é
å°è¯ï¼å¯åç<<x86/FreeBSD
4.5-RELEASE IO SmashåS/Keyæºå¶åæ>>ã
1987å¹´ï¼Henry Spencerå¨setuid(7)æå页ä¸åäºå¦ä¸å»ºè®®ï¼ä¸åæ åI/Oå¥æé½å¯
è½å å
³éè¿èä¸åæ¯çå®çæ åI/Oå¥æï¼å¨ä½¿ç¨printf()ä¸ç±»çå½æ°åï¼å¡å¿
确认
è¿äºå¥ææ¯æå¾
ä¸çæ åI/Oå¥æã1991å¹´ï¼å¨comp newsä¸æ人éè´´äºè¿ä»½ææ¡£ã
å
æ ¸è¡¥ä¸åºè¯¥ç¡®ä¿å¯¹äºSUIDãSGIDè¿ç¨èè¨ï¼0ã1ã2å·å¥æä¸ä¼è¢«æå¼åæåä¸ä¸ª
æ®éæ件ãè¿æå¾å¤å®ç°æ¹å¼ï¼æ¯å¦ä½¿å®ä»¬å
¨é¨æå/dev/nullãè¿ç§éå¶ä¸åºè¯¥å¨
åºå½æ°ä¸çº§å®ç°ï¼å¯è½æäºSUIDãSGIDç¨åºç´æ¥ä½¿ç¨ç³»ç»è°ç¨ã
stdinãstdoutãstderrä¸æä¸ä¸ªè¢«å
³éï¼é½å¯è½æ½å¨åå¨é®é¢ã
1992å¹´W. Richard Stevenså¨<<Advanced Programming in the UNIX Environment>>
ä¸å»ºè®®Daemonè¿ç¨åºè¯¥å
³éææä¸å¿
è¦çæ件å¥æï¼å¹¶å°stdinãstdoutãstderræ
å/dev/nullã
èª1998年以æ¥ï¼OpenBSDå
æ ¸ä¸execve()éæä¸ä¸ªæ£æ¥ï¼å¦æå¥æ0ã1ã2æ¯å
³éçï¼
å°±æå¼/dev/nullï¼ä½¿ä¹å¯¹åº0ã1ã2å·å¥æãè¿æ ·å°±å¯ä»¥å®å
¨å°æ§è¡setuidç¨åºäºã
FreeBSD/NetBSDç´è³æè¿æå次æ´é²åºç±»ä¼¼é®é¢ï¼èLinuxå¨glibcä¸åäºä¸äºæ£æ¥ã
ä½æ¯ï¼OpenBSDè¿ä¸ªæ£æ¥åå¨ä¸ä¸ªé®é¢ï¼å½falloc()失败æ¶ï¼åºè¯¥è½¬åé误å¤çï¼è
ä¸æ¯ç®åå°è·³åºå¾ªç¯ãartå¨æ³¨éä¸æåºäºè¿ç¹ï¼å´æ 人å»ä¿®æ£å®ã
--------------------------------------------------------------------------
sys/kern/kern_exec.c
å¨ä¸ä¸ªå¾ªç¯ä¸ï¼å
æ ¸è¯å¾æå¼/dev/nullï¼ä½¿ä¹å¯¹åº0-2å·å¥æ
(...)
if ( ( error = falloc( p, &fp, &indx ) ) != 0 )
{
break;
}
(...)
--------------------------------------------------------------------------
äºæ¯æ¬å°ç¨æ·è·å¾ä¸ä¸ªå
æ ¸æ件表项ç¸å
³çç«äºç¯å¢ï¼å¯ä»¥è·årootæéã