当前位置: 技术问答>linux和unix
利用fork 与 dup2 执行 系统命令, 别的命令都可以获取执行结果,就fdisk 命令不可以. execve("/sbin/fdisk",args,NULL) , args 命令参数.
来源: 互联网 发布时间:2016-05-20
本文导语: 问题: 利用 fork 与 dup2 执行程序命令的时候,别的命令都能输出出来。 比如: if ( -1 == (execve("/bin/ls", args, NULL)) ) 就能返回执行结果. 程序输出 ls的执行结果. 如果变成 if ( -1 == (execve("/sbin/fdisk", ...
问题:
利用 fork 与 dup2 执行程序命令的时候,别的命令都能输出出来。
比如:
if ( -1 == (execve("/bin/ls", args, NULL)) ) 就能返回执行结果. 程序输出 ls的执行结果.
如果变成 if ( -1 == (execve("/sbin/fdisk", args, NULL)) ) , 当然args 参数也在变.
程序就捕获不到标准输出了.
我想得到的结果是:
Command (m for help):
程序代码,linux 下编译调试通过:
#include
#include
#include
int main()
{
int pfds[2];
int ret =0;
char* buffer[101];
int howMany = 0;
char* args[] = {"/sbin/fdisk","/dev/sdb", NULL };/* Usb device*/
char* strs= NULL;
int fd;
if ( pipe(pfds) == 0 ) {
if ( fork() == 0 ) {
printf("-------parent id-----------n");
close(1);
ret = dup2( pfds[1], 1 );
fd = fopen("/root/mc.txt","wb");
if(ret == -1)
printf("-----error----n");
else
printf("--------success--------n");
close( pfds[0] );
howMany = read(pfds[1], buffer, 100);
printf("-buffer: %sn",buffer);
fwrite(buffer,1,100,fd);
printf("-------parent id-------end----n");
} else
{/*in*/
printf("-------child id-----------n");
close(0);
close(1);
ret = dup2( pfds[0], 0 );
close( pfds[1] );
if ( -1 == (execve("/sbin/fdisk",args, NULL)) )
{
perror( "execve" );
return -1;
}
}
}
return 0;
}
利用 fork 与 dup2 执行程序命令的时候,别的命令都能输出出来。
比如:
if ( -1 == (execve("/bin/ls", args, NULL)) ) 就能返回执行结果. 程序输出 ls的执行结果.
如果变成 if ( -1 == (execve("/sbin/fdisk", args, NULL)) ) , 当然args 参数也在变.
程序就捕获不到标准输出了.
我想得到的结果是:
Command (m for help):
程序代码,linux 下编译调试通过:
#include
#include
#include
int main()
{
int pfds[2];
int ret =0;
char* buffer[101];
int howMany = 0;
char* args[] = {"/sbin/fdisk","/dev/sdb", NULL };/* Usb device*/
char* strs= NULL;
int fd;
if ( pipe(pfds) == 0 ) {
if ( fork() == 0 ) {
printf("-------parent id-----------n");
close(1);
ret = dup2( pfds[1], 1 );
fd = fopen("/root/mc.txt","wb");
if(ret == -1)
printf("-----error----n");
else
printf("--------success--------n");
close( pfds[0] );
howMany = read(pfds[1], buffer, 100);
printf("-buffer: %sn",buffer);
fwrite(buffer,1,100,fd);
printf("-------parent id-------end----n");
} else
{/*in*/
printf("-------child id-----------n");
close(0);
close(1);
ret = dup2( pfds[0], 0 );
close( pfds[1] );
if ( -1 == (execve("/sbin/fdisk",args, NULL)) )
{
perror( "execve" );
return -1;
}
}
}
return 0;
}
|
我刚才试了一下,如下:
[root@localhost ~]# fdisk > a.txt
Usage: fdisk [-l] [-b SSZ] [-u] device
E.g.: fdisk /dev/hda (for the first IDE disk)
or: fdisk /dev/sdc (for the third SCSI disk)
or: fdisk /dev/eda (for the first PS/2 ESDI drive)
or: fdisk /dev/rd/c0d0 or: fdisk /dev/ida/c0d0 (for RAID devices)
...
[root@localhost ~]# less a.txt
[root@localhost ~]# fdisk >& a.txt
[root@localhost ~]# less a.txt
Usage: fdisk [-l] [-b SSZ] [-u] device
E.g.: fdisk /dev/hda (for the first IDE disk)
or: fdisk /dev/sdc (for the third SCSI disk)
or: fdisk /dev/eda (for the first PS/2 ESDI drive)
or: fdisk /dev/rd/c0d0 or: fdisk /dev/ida/c0d0 (for RAID devices)
...
[root@localhost ~]# fdisk的交互式输出是以标准错误的方式输出的,在你的标准输出设备上是不输出的,所以你需要重定向你的标准错误输出.
[root@localhost ~]# fdisk > a.txt
Usage: fdisk [-l] [-b SSZ] [-u] device
E.g.: fdisk /dev/hda (for the first IDE disk)
or: fdisk /dev/sdc (for the third SCSI disk)
or: fdisk /dev/eda (for the first PS/2 ESDI drive)
or: fdisk /dev/rd/c0d0 or: fdisk /dev/ida/c0d0 (for RAID devices)
...
[root@localhost ~]# less a.txt
[root@localhost ~]# fdisk >& a.txt
[root@localhost ~]# less a.txt
Usage: fdisk [-l] [-b SSZ] [-u] device
E.g.: fdisk /dev/hda (for the first IDE disk)
or: fdisk /dev/sdc (for the third SCSI disk)
or: fdisk /dev/eda (for the first PS/2 ESDI drive)
or: fdisk /dev/rd/c0d0 or: fdisk /dev/ida/c0d0 (for RAID devices)
...
[root@localhost ~]# fdisk的交互式输出是以标准错误的方式输出的,在你的标准输出设备上是不输出的,所以你需要重定向你的标准错误输出.
|
嗯,把标准输出跟错误输出重定向到文件里看看.
|
你的程序死在那里是什么意思?
|
楼主这样做的目的是什么? 是要在程序中格式化硬盘么? 如果是这样,可以不用这么麻烦,有比较简单直接的解决方法!