当前位置: 技术问答>linux和unix
execvp的一个问题
来源: 互联网 发布时间:2016-08-01
本文导语: 我们在终端上执行mysqldump命令这样: mysqldump --hex-blob -h 127.0.0.1 -uroot -proot ss_a > /ftp/db/ss_a.sql 现在写程序调用mysqldump执行这一个备份操作: argp[0] = "mysqldump"; argp[1] = "--hex-blob"; argp[2] = "-h"; argp[3] = val1...
我们在终端上执行mysqldump命令这样:
mysqldump --hex-blob -h 127.0.0.1 -uroot -proot ss_a > /ftp/db/ss_a.sql
现在写程序调用mysqldump执行这一个备份操作:
argp[0] = "mysqldump";
argp[1] = "--hex-blob";
argp[2] = "-h";
argp[3] = val1;
sprintf(argv_user,"-u%s",val2);
argp[4] = argv_user;
sprintf(argv_passwd,"-p%s",val3);
argp[5] = argv_passwd;
argp[6] = "account";
argp[7] = ">";
strcpy(sql_dump_file,ftp_file_path);
strcat(sql_dump_file,"/account.sql");
argp[8] = sql_dump_file;
argp[9] = (ha_char *)NULL;
然后fork一个进程调用
execvp("mysqldump",argp)
程序提示数据库没有表格 '>'
原来Mysqldump程序把argp7当做了表的名称。 本来>应该是重定向的标准输出。
我想在调用fork以前执行重定向一下标准输出,但是由于这个函数是在一个子进程中执行的,所以担心随便修改标准输出会影响主进程的工作,也会将主进程的输出重定向到文件中,这样Dump出来的的数据就是错的了
由于某种原因,还不能把重定向标准输出放在Fork的子进程中。
在这种情况下,如何解决这个问题呢?
谢谢
mysqldump --hex-blob -h 127.0.0.1 -uroot -proot ss_a > /ftp/db/ss_a.sql
现在写程序调用mysqldump执行这一个备份操作:
argp[0] = "mysqldump";
argp[1] = "--hex-blob";
argp[2] = "-h";
argp[3] = val1;
sprintf(argv_user,"-u%s",val2);
argp[4] = argv_user;
sprintf(argv_passwd,"-p%s",val3);
argp[5] = argv_passwd;
argp[6] = "account";
argp[7] = ">";
strcpy(sql_dump_file,ftp_file_path);
strcat(sql_dump_file,"/account.sql");
argp[8] = sql_dump_file;
argp[9] = (ha_char *)NULL;
然后fork一个进程调用
execvp("mysqldump",argp)
程序提示数据库没有表格 '>'
原来Mysqldump程序把argp7当做了表的名称。 本来>应该是重定向的标准输出。
我想在调用fork以前执行重定向一下标准输出,但是由于这个函数是在一个子进程中执行的,所以担心随便修改标准输出会影响主进程的工作,也会将主进程的输出重定向到文件中,这样Dump出来的的数据就是错的了
由于某种原因,还不能把重定向标准输出放在Fork的子进程中。
在这种情况下,如何解决这个问题呢?
谢谢
|
用system就可以了,如果不想用system
可以在fork后,子进程的部分,execvp之前修改stdout
if (0 == (pid = fork())) {
fclose(stdout);
stdout = fopen("/ftp/db/ss_a.sql", "wb");
execvp(...);
}
|
是啊 这个用起来很方便啊
|
父子进程之间没有共享内存和资源
所以你尽管放心把子进程的标准输出重定向到文件
所以你尽管放心把子进程的标准输出重定向到文件