popen函数用法...急,在线等

gql1123 2012-01-05 11:20:44
请教个问题
我用popen打开一个执行命令
代码如下

fd = popen("mkfs.ext3 /dev/sda1", "r");
if(!fd)
{
return ERROR;
}
while(fread(buf, 1, 1, fd))
{
printf("%s", buf);
}

为何我打印出来的只是
mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2011296 inodes, 4016242 blocks
200812 blocks (5.00%) reserved for the super user
First data block=0
123 block groups
32768 blocks per group, 32768 fragments per group
16352 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

而手动执行mkfs.ext3 /dev/sda1
显示如下
/dev $ mkfs.ext3 sda1
mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2011296 inodes, 4016242 blocks
200812 blocks (5.00%) reserved for the super user
First data block=0
123 block groups
32768 blocks per group, 32768 fragments per group
16352 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Writing inode tables: 61/123

我想通过popen读取格式化硬盘的进度。该如何做啊?
...全文
264 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gql1123 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
楼主,我和你的需求一样,麻烦你把你的实现方法再说的详细一些好吗?谢谢了。
还有,我通过popen运行我的格式化shell,打印出来的信息会延时,即所有参数都为done的时候才打印出来,中间的进度显示不出来,不知道你是否遇到过这种情况?
[/Quote]
代码我都贴出来啊。
wytconstantine 2012-04-17
  • 打赏
  • 举报
回复
楼主,我和你的需求一样,麻烦你把你的实现方法再说的详细一些好吗?谢谢了。
还有,我通过popen运行我的格式化shell,打印出来的信息会延时,即所有参数都为done的时候才打印出来,中间的进度显示不出来,不知道你是否遇到过这种情况?
lxq0109 2012-01-12
  • 打赏
  • 举报
回复
照楼上的测试了下,没搞定
gql1123 2012-01-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qq120848369 的回复:]
popen不是返回FILE*吗,竟然起名fd...

fgets去读。
[/Quote]

大哥fgets也不行啊!
gql1123 2012-01-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lgch123456 的回复:]
用fgets + sscanf 函数,解析你的打印信息,但是解析的速度如果比格式化速度慢的话 你的进度信息将会是不准确的。还有就是看看mkfs的源代码,在里面将格式化进度的那个值取出来进行。类似的操作在cdrecord里就有。
[/Quote]
sscanf这个会用。关键出不来进度,如何sscanf?
gql1123 2012-01-05
  • 打赏
  • 举报
回复
fget的结果如下

mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2011296 inodes, 4016242 blocks
200812 blocks (5.00%) reserved for the super user
First data block=0
123 block groups
32768 blocks per group, 32768 fragments per group
16352 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208


还是不现实进度。最后结果
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2011296 inodes, 4016242 blocks
200812 blocks (5.00%) reserved for the super user
First data block=0
123 block groups
32768 blocks per group, 32768 fragments per group
16352 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
和那个fread一样的。
qq120848369 2012-01-05
  • 打赏
  • 举报
回复
popen不是返回FILE*吗,竟然起名fd...

fgets去读。
lgch123456 2012-01-05
  • 打赏
  • 举报
回复
用fgets + sscanf 函数,解析你的打印信息,但是解析的速度如果比格式化速度慢的话 你的进度信息将会是不准确的。还有就是看看mkfs的源代码,在里面将格式化进度的那个值取出来进行。类似的操作在cdrecord里就有。
linus 2012-01-05
  • 打赏
  • 举报
回复
用fgets吧
gql1123 2012-01-05
  • 打赏
  • 举报
回复
自己顶啊。我是想是实现硬盘格式化的进度显示。显示在web页面。有没有高手啊...
gql1123 2012-01-05
  • 打赏
  • 举报
回复
也就是说,没有打印出来进度字符。是怎么回事呢?是不是fread无法读出退格键 \b?还是我其他的地方做的不对?急救啊....
gql1123 2012-01-05
  • 打赏
  • 举报
回复
回复如何贴代码?
gql1123 2012-01-05
  • 打赏
  • 举报
回复 1
搞定了。多谢各位。
一个字符一个字符的读取。发现里面有退格符号。所以fgets不了。自己写了搜索算法。
while(fread(&xx, 1, 1, fd))
{
/*搜索退格键*/
if(xx == 8)
{
while(fread(&xx, 1, 1, fd))
{
if(xx!=8)
{
memset(has, 0, sizeof(has));
memset(all, 0, sizeof(all));
has[0] = xx;
i = 1;
while(fread(&xx, 1, 1, fd))
{
if(xx != '/')
{
has[i] = xx;
i++;
continue;
}
else
{
j = 0;
while(fread(&xx, 1, 1, fd))
{
if(xx==8)
break;
else
{
all[j] = xx;
j++;
}
}
}
printf("%s/%s\n", has, all);
break;
}
}
}
}
}
qq120848369 2012-01-05
  • 打赏
  • 举报
回复
没看懂需求。。

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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