【发布时间】:2015-03-18 00:50:22
【问题描述】:
我的 parent.c 文件中有这个
int main()
{
int n = 6;
int pid;
int status;
char* command = "./child";
for (i=1; i<=n; i++){
if((pid = fork()) == 0) {
execvp(command, NULL);
}
wait(&status);
}
我的 child.c 文件如下所示
int main(int argc, char *argv[]){
char *processnum = argv[0];
printf("This is the child %s\n", processnum);
return 0;
}
我基本上只是跑了
gcc -o parent parent.c
gcc -o child child.c
./父母
这会打印 6 次“This is the child (null)”,这是我所期望的。但是我希望能够在运行 child 时传递一个参数,在这种情况下是进程号。
所以我把我的 parent.c 改成这样
for (i=1; i<=n; i++){
if(i == 1){
char* args = "1";
}
if(i == 2){
char* args = "2";
}
if(i == 3){
char* args = "3";
}
if(i == 4){
char* args = "4";
}
if(i == 5){
char* args = "5";
}
if(i == 6){
char* args = "6";
}
if((pid = fork()) == 0) {
execvp(command, args);
}
wait(&status);
}
我认为会发生的是我的程序会打印“这是孩子 1”、“这是孩子 2”等...
但是,实际发生的情况是程序似乎多次运行 parent.c(我在 parent.c 的开头放置了一个打印语句,输出打印了 20 次该语句)而不是 child.c
谁能解释为什么会这样?还有其他方法可以将参数传递给 child.c 吗?
谢谢
【问题讨论】:
-
您为什么期望
argv[0]的值是0或1?execvp的手册页解释了如何传递参数。您传递的内容不正确。它需要char *argv[](指向参数指针数组的指针)。顺便说一句,您的if语句字符串将作为switch语句完成。 -
最初我尝试设置 command = "./child 6" 例如,我希望 argv[0] 将存储 6 并且我可以在孩子中使用它,但它不起作用
-
如果您阅读
execvp的文档,它应该会澄清一些事情。