我正在调用一个函数,它将为我分支并执行另一个进程的代码.有多个进程,标记为B,C和D.我有几乎相同的代码用于创建不同的进程.由于某些奇怪的原因我无法发现,其中一个进程创建函数会导致分段错误.他们看起来和我一模一样.任何人都有可能权衡,也许能让我对这个问题有所了解吗?
void spawn_process_b(int fileID[]){
int pid;
char * argv[2];
sprintf(argv[0], "%d", fileID[0]);
sprintf(argv[1], "%d", fileID[1]);
pid = fork();
if (pid == 0)
{
execv("PipeW1", argv);
}
}
void spawn_process_c(int fileID[]){
int pid;
char * argv[2];
sprintf(argv[0], "%d", fileID[0]);
sprintf(argv[1], "%d", fileID[1]);
pid = fork();
if (pid == 0)
{
execv("PipeW2", argv);
}
}
Run Code Online (Sandbox Code Playgroud)
通过输入cout <<"bp1"<< endl; 等等,我发现spawn_process_b会执行得很好.spawn_process_c将进入,但在第一个sprintf指令处获得段错误.有人有主意吗?最初spawn_process_b给了我麻烦,而且...我的手给了上帝...我没有改变一件事,它开始工作了.我几乎想知道这是否可能依赖于环境?
argv[0]是一个未定义的指针,当你sprintf进入它时没有分配存储.
当它完全奏效的时候,它是偶然的,你所潦草的记忆正好发生在你的过程空间里.
你的auto声明argv为两个char *指针分配了空间.指针可能充满了垃圾(也就是说,它们指向随机位置)并且没有分配空间来存储它们中的字符.
你需要类似的东西
char *argv[3];
for (int i = 0; i < 2; i++)
argv[i] = malloc(space enough for my integer);
argv[2] = 0;
Run Code Online (Sandbox Code Playgroud)
最后一行的重要性 execv