【发布时间】:2019-12-27 20:05:59
【问题描述】:
我正在尝试实现以下目标:我从输入文本文件中读取 nr 个单词,并且对于每个单词我想启动一个子进程来修改单词并将其返回到输出文本文件中.输出波动,有时我把单词弄乱了(苹果香蕉变成了appbananale),有时输出文件是20kb,它会冻结文本编辑器。
int main(int argc, char **argv){
int in, out, i, nr, k, j;
char buffer[100];
in = open(argv[1], O_RDONLY);
if (in == -1){
perror(NULL);
return errno;
}
out = open(argv[2], O_WRONLY | O_CREAT, 0666);
if (out == -1){
perror(NULL);
return errno;
}
if (read(in, buffer, 100) == -1){
perror(NULL);
return errno;
}
nr = 5;
k=0;
srand(time(NULL));
char v[20];
int l;
j=0;
pid_t pid;
for (i=1;i<sizeof(buffer);i++){
if (k == nr) break;
if (buffer[i]=='\n'){
k++;
pid = fork();
if (pid < 0)
return errno;
if (pid == 0){
//for (l=0;l<j;l++)
write (out, v, j);
return 0;
}
j=0;
}
else{
j++;
v[j-1]=buffer[i];
}
}
return 0;
}
【问题讨论】:
-
“休息无关紧要”。不在 Stackoverflow 上,它不是。请阅读How do I ask a good question?。特别是,要求调试帮助的所有 Stackoverflow 问题都需要发布 minimal verifiable example。
-
在处理访问共享资源的多个进程时,您需要实现同步,以便按照定义的顺序访问共享资源。似乎您没有,因此进程将以交错和随机顺序写入文件。
-
什么是
out?您是否同时从多个进程写入同一个文件描述符? -
看起来
j在j++中使用时未初始化,这将导致未定义(不可预测)的行为。是的,完整的代码确认您缺少同步。 -
关于
j,这只是将问题转移到这一行:for (l=0;l<j;l++)因为j=0那时尚未执行。而且您不能将buffer[0]用作这样的数字。您需要使用atoi或strtol将其从ascii 值转换为整数。但是你需要传递一个字符串而不是一个字节。