[新手报道]:Linux下怎么用printf无法将信息打印出来?

jessiepan 2008-06-18 08:48:21
先简单介绍一下我使用的平台: ARM9,Arm-Linux-kernel 2.4.19,超级终端(COM1).

printf("FController:adding control client on fd %d\n", client_sockfd);
////////////////////////////////////////////////////////
printf("FFly Record Starting!!\n");
system("ffly record start");
///////////////////////////////////////////////////////

明明知道这段代码已经被执行了,因为ARM已经将录象的文件保存到了SD卡中,但为何超级终端上无法打印出调试信息呢? 这段代码节选自FController.c(有关网络数据的接收及命令解析线程代码). 不会是要将 printf 调试信息打印出来,还要 GCC 带一个特定参数进行编译吧? 还是因为在网络数据接收的线程里,没办法打印出信息??

小弟,刚接触嵌入Linux编程,对ARM-LINUX下的程序调试很陌生! 这个问题已经困绕我好几天了.
请各位前辈帮帮忙啊!thanks.
...全文
3291 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
跟随内心 2011-08-20
  • 打赏
  • 举报
回复
可不可以把那些具有重定向的代码给屏蔽掉呀~~直接不让重定向生效
HEXVIEW 2009-12-30
  • 打赏
  • 举报
回复
谢谢3楼的
jilily 2009-07-14
  • 打赏
  • 举报
回复
楼主的重定向code,怎么跟我们用的一样的?难不成一个公司的?
fuqd273 2008-06-24
  • 打赏
  • 举报
回复
16楼正解。

自己写一个log输出函数,用自己保留的文件id来进行标准输出。
偶像罗斯福 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 悠悠长风 的回复:]
1,看看是否重定向了;
2,输出是有缓冲的,加一个换行符\n看看。
[/Quote]
fierygnu 2008-06-23
  • 打赏
  • 举报
回复
你没有说清楚你的打印代码和do_cgi是什么关系。

可以在程序开头复制STDOUT_FILENO,写一个自己的输出函数,函数内用write来输出到复制的描述符去。
jessiepan 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 chinaproud 的回复:]
引用 3 楼 zdhsoft 的回复:
你要加一个\n,就可以显示出来了。



同意。应该是这个原因
[/Quote]

这个地方我已经Check过了,不是这个原因! 谢谢.

原因大概已经找到,可能是在mini_httpd.c里调用了dup2()函数,进行了输出重定向所造成的. 有没有哪位高手对这方面比较熟的? 帮帮忙啊!
e20080520 2008-06-23
  • 打赏
  • 举报
回复
我突然想起一个问题:可能是你打印的时候被覆盖就看不到了。这样吧,在你想看打印内容之前,你先运行 clear 一下
e20080520 2008-06-23
  • 打赏
  • 举报
回复
我突然想起一个问题:可能是你打印的时候被覆盖就看不到了。这样吧,在你想看打印内容之前,你先运行 clear 一下
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zdhsoft 的回复:]
你要加一个\n,就可以显示出来了。
[/Quote]


同意。应该是这个原因
威廉-丁 2008-06-21
  • 打赏
  • 举报
回复
我对整个Arm-Linux端软件系统的理解,当FController线程调用select()函数后该线程被系统挂起,等待接收PC端软件发过来的TCP数据包并进行命令的解析;而mini_httpd.c实现的Web-Server跑起来,当IE里有执行图象页面的浏览操作后,CGI里将执行dup2()函数对STDOUT_FILENO的标准输出进行重定向,以便在IE里输出相关的操作提示信息.
不知,我的理解正确否?请大虾过来指点一下.

我现在很想知道,如果我要把超级终端里的打印信息恢复(不需要在IE里输出信息),该如何修改mini_httpd.c里的有关代码呢?
请高手过来看看!谢谢啊


顶一下.
jessiepan 2008-06-21
  • 打赏
  • 举报
回复
我对整个Arm-Linux端软件系统的理解,当FController线程调用select()函数后该线程被系统挂起,等待接收PC端软件发过来的TCP数据包并进行命令的解析;而mini_httpd.c实现的Web-Server跑起来,当IE里有执行图象页面的浏览操作后,CGI里将执行dup2()函数对STDOUT_FILENO的标准输出进行重定向,以便在IE里输出相关的操作提示信息.
不知,我的理解正确否?请大虾过来指点一下.

我现在很想知道,如果我要把超级终端里的打印信息恢复(不需要在IE里输出信息),该如何修改mini_httpd.c里的有关代码呢?
请高手过来看看!谢谢啊
jessiepan 2008-06-20
  • 打赏
  • 举报
回复
从昨天一直到今天都在折腾这个东西,终于发现问题了!是有输出重定向. 在mini_httpd.c里调用了dup2()函数,这个程序主要是用来实现 Web-Server ,完成PC端IE浏览器和Arm 端Linux通信的.

贴出部分代码如下:
static void
do_cgi( void )
{
char** argp;
char** envp;
int parse_headers;
char* binary;
char* directory;

if ( method != METHOD_GET && method != METHOD_POST )
send_error( 501, "Not Implemented", "", "That method is not implemented for CGI." );

if ( conn_fd == STDIN_FILENO || conn_fd == STDOUT_FILENO || conn_fd == STDERR_FILENO )
{
int newfd = dup2( conn_fd, STDERR_FILENO + 1 );
if ( newfd >= 0 )
conn_fd = newfd;

/* Make the environment vector. */
envp = make_envp();

/* Make the argument vector. */
argp = make_argp();

#ifdef USE_SSL
if ( ( method == METHOD_POST && request_len > request_idx ) || do_ssl )
#else /* USE_SSL */
if ( ( method == METHOD_POST && request_len > request_idx ) )
#endif /* USE_SSL */
{
int p[2];
int r;

if ( pipe( p ) < 0 )
send_error( 500, "Internal Error", "", "Something unexpected went wrong making a pipe." );
r = fork();
if ( r < 0 )
send_error( 500, "Internal Error", "", "Something unexpected went wrong forking an interposer." );
if ( r == 0 )
{
/* Interposer process. */
(void) close( p[0] );
cgi_interpose_input( p[1] );
exit( 0 );
}
(void) close( p[1] );
if ( p[0] != STDIN_FILENO )
{
(void) dup2( p[0], STDIN_FILENO );
(void) close( p[0] );
}
}
else
{
/* Otherwise, the request socket is stdin. */
if ( conn_fd != STDIN_FILENO )
(void) dup2( conn_fd, STDIN_FILENO );
}

/* Set up stdout/stderr. For SSL, or if we're doing CGI header parsing,
** we need an output interposer too.
*/
if ( strncmp( argp[0], "nph-", 4 ) == 0 )
parse_headers = 0;
else
parse_headers = 1;
#ifdef USE_SSL
if ( parse_headers || do_ssl )
#else /* USE_SSL */
if ( parse_headers )
#endif /* USE_SSL */
{
int p[2];
int r;

if ( pipe( p ) < 0 )
send_error( 500, "Internal Error", "", "Something unexpected went wrong making a pipe." );
r = fork();
if ( r < 0 )
send_error( 500, "Internal Error", "", "Something unexpected went wrong forking an interposer." );
if ( r == 0 )
{
/* Interposer process. */
(void) close( p[1] );
cgi_interpose_output( p[0], parse_headers );
exit( 0 );
}
(void) close( p[0] );
if ( p[1] != STDOUT_FILENO )
(void) dup2( p[1], STDOUT_FILENO );
if ( p[1] != STDERR_FILENO )
(void) dup2( p[1], STDERR_FILENO );
if ( p[1] != STDOUT_FILENO && p[1] != STDERR_FILENO )
(void) close( p[1] );
}
else
{
/* Otherwise, the request socket is stdout/stderr. */
if ( conn_fd != STDOUT_FILENO )
(void) dup2( conn_fd, STDOUT_FILENO );
if ( conn_fd != STDERR_FILENO )
(void) dup2( conn_fd, STDERR_FILENO );
}

哎!看晕了. 我想如果我要把超级终端里的打印信息回复,该如何该代码呢?
他的这段输出重定向,是不是把他的输出信息全部放到IE浏览器中打印输出了??
bshawk 2008-06-19
  • 打赏
  • 举报
回复
输出转向就是你把标准输出(stdout)重定向到了其他文件描述符!
比如你有输出打印的执行程序 test,在命令行执行 ./test > log.txt 那么所有的输出信息都重定向到文件log.txt中了。标准输出就看不到打印了。

具体到编程,看你程序中是不是调用了dup2()函数。比如dup2(fd3, STDOUT_FILENO)就将标准输出重定向到fd3代表的文件中了。而STDOUT_FILENO被关闭掉。所以无法在标准输出看到打印信息。

man dup/dup2 看看吧!
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cceczjxy 的回复:]
可能是你运行是输出转向了。
[/Quote]
?????????????????
fuqd273 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cceczjxy 的回复:]
可能是你运行是输出转向了。
[/Quote]
hefuhua 2008-06-19
  • 打赏
  • 举报
回复
楼主的程序是以后台运行吗?
e20080520 2008-06-19
  • 打赏
  • 举报
回复
不知道为什么,平时我用的时候都是可以的
过客猫2022 2008-06-19
  • 打赏
  • 举报
回复
你要加一个\n,就可以显示出来了。
悠悠长风 2008-06-19
  • 打赏
  • 举报
回复
1,看看是否重定向了;
2,输出是有缓冲的,加一个换行符\n看看。
加载更多回复(3)
内容概要:本文提出了一种基于粒子群优化算法(PSO)的风光储能微电网日前经济调度模型,创新性地引入需求响应机制,以实现系统运行成本最小化为目标。该模型综合考虑风力发电、光伏发电、储能系统及可调节负荷的运行特性,构建了包含电力供需平衡、设备出力能力、储能容量约束在内的完整数学模型,并通过Python编程实现PSO算法求解,有效提升了新能源消纳水平并降低了购电成本与运行费用。研究不仅实现了多能源协调优化调度,还为高比例可再生能源接入背景下的微电网经济运行提供了可行的技术路径。; 适合人群:具备一定电力系统基础知识和Python编程能力的科研人员、研究生及从事新能源微电网优化调度相关工作的工程技术人员。; 使用场景及目标:①研究含高比例可再生能源的微电网经济调度问题;②掌握粒子群算法在电力系统优化中的建模与应用方法;③开展计及需求响应的多能源协同调度仿真分析,探索用户侧灵活性资源参与系统优化的潜力。; 阅读建议:建议读者结合提供的Python代码深入理解算法实现细节,重点关注目标函数构建、约束条件处理及PSO参数设置,可进一步拓展至其他智能优化算法对比分析,或引入碳排放、电压稳定性等多目标优化维度进行深化研究。
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 修改自己电脑的OEM信息及产品ID 本文主要讲述了如何修改自己电脑的OEM信息及产品ID,以拥有一个跟正版一样的显示效果。 文章共分为两种方法介绍了如何修改OEM信息,分别是通过软件进行修改和手动修改注册表信息。 方法一:通过软件进行修改 软件可以帮助用户快速地修改OEM信息,使用非常简单,只要选择想要修改到的厂商就可以了。 然后在高级选项中选择是否要在开始菜单中显示OEM图标和厂商信息。 通过以上步骤,用户的电脑就能拥有一个跟OEM版本一样的信息了! 方法二:手动修改注册表信息 手动修改注册表信息需要用户具备一定的计算机知识和技能。 用户需要上网搜索一张OEM logo或者从另外一台电脑上复制一张logo到自己的电脑上。 然后,用户需要找一个图标文件命名为 OEMLINKICON.ICO,作为支持信息之前的那个小图标。 接下来,用户需要修改个人信息,打开注册表编辑器,搜索到“RegisteredOwner”和“RegisteredOrganization”,这两样分别指注册者姓名和注册者单位,修改成自己的就可以了。 然后,用户需要制作“厂商、电脑型号”和“技术支持信息”(如果你的电脑有的话)。 新建一个文本文档,输入[Version]Microsoft Windows Whistler EditionWinVer=5.01[General]Manufacturer=xx(厂商)有限公司Model=xx 系列电脑[Support Information],这是“技术支持信息”的内容。 Line1=""Line2=""Line3=""Li...
内容概要:本文介绍了一项关于“风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真”的技术研究,重点探讨虚拟同步发电机(VSG)控制策略在风力发电与储能系统联合并网中的应用。通过Simulink搭建风储协同动态模型,引入VSG控制以模拟传统同步发电机的惯性与阻尼特性,有效提升系统在电网扰动下的频率稳定性与电能质量。该仿真系统可用于分析风储系统的功率协调控制、动态响应特性及并网稳定性,适用于高比例可再生能源接入背景下的新型电力系统研究与优化设计。; 适合人群:具备电力系统、自动控制或新能源等相关专业背景的研究生、科研人员,以及从事风电并网、储能系统开发与电力电子控制的工程技术人员。; 使用场景及目标:①开展风储联合并网系统的建模与动态仿真研究;②验证VSG控制策略对系统稳定性的提升效果;③用于高校教学演示、科研项目中的VSG原理分析与性能评估;④支持学术论文复现、课题创新及先进控制算法的开发与测试; 阅读建议:建议使用者熟悉Simulink建模流程及电力电子变换器控制原理,结合提供的仿真模型进行实操演练,重点关注VSG关键参数(如虚拟惯量、阻尼系数)对系统动态性能的影响,并可进一步拓展至多机并联、孤岛/并网模式切换等复杂运行工况的研究。

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧