尝试将变量传递给子进程

时间:2013-12-01 00:04:43

标签: c consumer producer

我正在尝试将变量传递给一个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 ();
  }
}

1 个答案:

答案 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,但显然你应该使用你认为必要的长度)。