我有一个类似打击的程序:
int main()
{
char * const args[2]={"a", "b",};
int pid = fork();
if ( pid == 0 ) {
execv("./printargs", args);
}
return 0;
}
当我从终端运行它时。 execv()执行printargs并打印agrs []的所有值。所以程序运行正常。
但是当我稍微更改程序以接受输入并重新编写程序时如下:
int main()
{
char * args[2];
args[0] = (char*)malloc(sizeof(char)*10);
args[1] = (char*)malloc(sizeof(char)*10);
scanf("%s", args[0]);
scanf("%s", args[1]);
int pid = fork();
if ( pid == 0 ) {
execv("./printargs", args);
}
return 0;
}
然后execv()没有工作&我不明白是什么问题
但我需要通过从输入中获取值来动态传递args。
提前感谢您的帮助。
答案 0 :(得分:1)
所以我在这里说你有以下问题:
execv
需要第二个参数作为以NULL结尾的数组(所以最后一个值必须是NULL值)args[1]
而不是args[0]
%10s
表示scanf
最多可读取10个字符+之后添加前导\0
,因此可能是11个字符!使用%9s
或增加分配大小以下示例代码执行大致相同(使用/bin/echo
命令而不是./prinargs
):
int main()
{
char * args[4]; // 1 for bin name, 2 for args, 1 for NULL
args[0] = "/bin/echo"; // you may put what you want here, in fact
args[1] = (char*)malloc(sizeof(char)*10);
args[2] = (char*)malloc(sizeof(char)*10);
args[3] = NULL; // NULL-terminated
scanf("%9s", args[1]); // read 9 (+1 for \0)
scanf("%9s", args[2]);
int pid = fork();
if (pid == -1) { // handle fork() error
perror("fork"); // print out the reason
exit(1); // and leave
} else if (pid == 0) {
// child
execv("/bin/echo", args);
perror("execv"); // we are here only if execv failed
exit(1); // so print out error and exit
}
// here you should wait for your child to get returned value
// see wait() and similar functions
return 0;
}
大部分时间最好等孩子(使用wait()
家庭),以便父亲不会在孩子面前结束,你也可以获得其返回状态(即如果exit()
失败,则返回您执行的命令或execv()
值。