免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2862 | 回复: 9
打印 上一主题 下一主题

[C] 重定向标准输入、输出、错误的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-13 09:49 |只看该作者 |倒序浏览
最近要把一个原来的程序改成daemon的,因为之前debug信息都是直接使用printf打印到stdout上的,因此我想做成daemon时还保留我这种debug的方式,于是想重定向stdin和stdout,stderr,我自己写了个测试程序,把stdin重定向到打开/dev/null/的这个句柄上,stdout重定向到./klsa/klsa.log,stderr重定向到./klsa/klsa_err.log中,然后我用printf和perror测试了下发现并没有写到./klsa/klsa.log和./klsa/klsa_err.log中,大家解释下这是为什么?
代码如下:
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* agent_daemon.c : make push_agent daemonify
*
* Author: tyz,if you compile error,feel free to contact me
* Created on 2009年10月12日, 下午8:22
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>

#define MAXFD 64

/**
* daemon_init:
*
* Detach agent daemon from the controlling terminal
*/

int daemon_init(void)
{
    int i;
    pid_t pid;

    if ( (pid = fork()) < 0)
    return (-1);
    else if (pid)
        exit(0);/* parent terminates */

    /* child 1 continues... */

    if (setsid() < 0)/* become session leader */
    return (-1);

    //signal(SIGHUP, SIG_IGN);

    if ( (pid = fork()) < 0)
    return (-1);
    else if (pid)
        exit(0);/* child 1 terminates */

    /* child 2 continues... */

    chdir("/");/* change working directory */

    /* close off file descriptors */
    for (i = 0; i < MAXFD; i++)
    close(i);
   
    /* redirect stdin, stdout, and stderr to /dev/null */
    open("/dev/null", O_RDONLY);
    open("./klsa/klsa.log", O_RDWR);
    open("./klsa/klsa_err.log", O_RDWR);

    //openlog(pname, LOG_PID, facility);


    return (0);/* success */
}

int main(int argc,char **argv)
{
       printf("\r\r\rkkkkkkkkkkkkkkkkkkkkkk\n") ;

    /* mkdir in the /var/lib/ */
    system("mkdir ./klsa") ;
   
    /* create two files to redirect stdin and stdout */
    fopen("./klsa/klsa.log", "a+");   /* stdout fd=1*/
    fopen("./klsa/klsa_err.log", "a+"); /* stderr fd=2 */
       daemon_init() ;
   
       while(1)
    {
        printf("hehehehe\n") ;
        perror("tyzTest:\n") ;
        write(stdout,"hhhhhh\n",1) ;
        close(stdout) ;
        sleep(10) ;
    }
    return 0 ;
}

论坛徽章:
0
2 [报告]
发表于 2009-10-13 09:50 |只看该作者
大家帮忙看看,谢谢!

论坛徽章:
0
3 [报告]
发表于 2009-10-13 10:04 |只看该作者
重定向 std*

用fopen

[ 本帖最后由 net_robber 于 2009-10-13 10:13 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-10-13 10:15 |只看该作者
没说清楚,

fopen有返回值的


printf对应的还有fprintf

看一下相关手册

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
5 [报告]
发表于 2009-10-13 10:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2009-10-13 10:30 |只看该作者

回复 #4 net_robber 的帖子

貌似不行,

论坛徽章:
0
7 [报告]
发表于 2009-10-13 10:32 |只看该作者

回复 #5 c/unix 的帖子

我的daemon先把文件描述符给关掉了,然后又打开了3个文件,这3个文件的句柄肯定就是0,1,2,这不就是对应的
std*的描述符么?

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
8 [报告]
发表于 2009-10-13 11:27 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2009-10-13 12:17 |只看该作者

回复 #8 c/unix 的帖子

原来是这样的阿,谢谢!

论坛徽章:
0
10 [报告]
发表于 2009-10-13 13:01 |只看该作者
来迟了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP