我正在尝试将变量传递给一个forks的函数,大多数似乎都有效,但是我需要给每个我正在尝试传递的id,而argv [5]之前没有声明过。我的代码保持seg错误,我无法弄清楚原因。有什么想法吗?
主要
char* arg_list_consumer[] = {
"./consume",
argv[1],
argv[2],
NULL
};
char* arg_list_producer[] = {
"./produce",
argv[1],
argv[2],
argv[3],
argv[4],
argv[5],
NULL
};
if (getppid()==1){
producerID=0;
}
if(producerID==0){
for(i=1; i<P; i++){
sprintf(arg_list_producer[5], "%d", i);
spawn ("./produce", arg_list_producer);
}
for(i=0; i<C; i++){
sprintf(arg_list_consumer[5], "%d", i);
spawn ("./consume", arg_list_consumer);
}
}
菌种
int spawn (char* program, char** arg_list)
{
pid_t child_pid;
/* Duplicate this process. */
child_pid = fork();
if (child_pid != 0)
/* This is the parent process. */
return child_pid;
else {
/* Now execute PROGRAM, searching for it in the path. */
execvp (program, arg_list);
/* The execvp function returns only if an error occurs. */
fprintf (stderr, "an error occurred in execvp\n");
abort ();
}
}
答案 0 :(得分:1)
arg_list_consumer声明只有4个条目。因此,使用[5]索引它是无效的内存操作。
如果要为arg_list_consumer [5]分配一个值,则必须将该数组声明为至少大小为6的指针(或者您可以多输入几个NULL以使其大小至少为6个指针) )。
然后,如果要使用sprintf存储内容,则必须已在目标字符串中分配空间。由于您只有一个指针数组,这意味着您必须使用malloc来分配一些空间:
arg_list_consumer[5] = malloc(sizeof(char)*10);
sprintf(arg_list_consume[5], "%d", i);
(我使用了10,但显然你应该使用你认为必要的长度)。