C中的并发程序(顺序问题)
Concurrent program in C(sequential issue)
我正在尝试找到一种方法使该算法 运行 并发并且是同步的。到目前为止,它只有 1 个 for 循环读取每个文件,然后对每个文件进行处理。
我相信这个算法 运行s sequentially 这不是我想要的......
我考虑过创建一个外部 for 循环,在其中放置 wait(null) 和 read 命令。但是当我尝试时它不起作用,没有产生输出。目前我在父进程中有 wait(null) 命令。
有什么建议吗?
代码:
int main(int argc, char *argv[])
{
// ATTRIBUTES //
int freq[argc-1], ipc[argc][2], nbytes, i;// freq of words, pipes, counters
ssize_t errorfi;
char readbuffer[9999];
char** k = malloc(50);
char** op = malloc(50);
if(argc == ONE) { // there are no files given, throw error and close
fprintf(stderr, "There are no files found from %s\n", argv[0]);
exit(0);
}
for(i = 1; i < argc; i++) // creates pipes for ipc
pipe(ipc[i]);
pid_t pids[argc-1]; // array of pids
for(i = 1; i < argc; i++) { // reads input after position 0(a.out)
pid_t pid = fork(); // creates process
pids[i-1] = pid;
if( pid < 0 ) { // bad fork process: error
perror("bad fork");
exit(0);
}
else if(pid > 0) { //parent process
close(ipc[i][1]);
wait(NULL);
nbytes = read(ipc[i][0], readbuffer, sizeof(readbuffer));
if(nbytes > 0)
printf("%s\n", readbuffer);
}
else if(pid == 0) { // child process
close(ipc[i][0]);
k = inputReader(argv[i]); // finds filename,w1,w2,w3,uniqueWords
char info[50] = "";
strcat(info, k[0]);
strcat(info, " ");
strcat(info, k[1]);
strcat(info, " ");
strcat(info, k[2]);
strcat(info, " ");
strcat(info, k[3]);
strcat(info, " ");
strcat(info, k[4]);
int uniqueWordint = atoi(k[4]);
freq[i-1] = uniqueWordint; // freq of all uniqueWords
errorfi = write(ipc[i][1], info, strlen(info)+1); // writes info to pipe i
if (errorfi < 0 ) {
fprintf(stderr, "error found when writing in pipe errofi: %d\n", errorfi);
exit(0);
}
exit(0); // close process
} // closes child process
} // closes for-loop for each process
for(j = 0; j < argc-1; j++) {
wait(2); // if i put read command here it won't work
}
return(0); // close main
}
这确实是一个顺序执行。父进程进入一个循环,fork一个子进程,直到那个子进程完成后才会继续下一个循环。
您可以创建一个大小为 argc
的 pid_t
数组来存储每个 fork()
的 return 值。
在 "for-loop for each process" 之后创建一个新循环,其中父进程将使用 wait(2)
or waitpid(2)
等待他的所有子进程,具体取决于您是否需要按特定顺序处理每个子进程的结果,并且继续处理它们(read
ing 或任何需要的东西。
我正在尝试找到一种方法使该算法 运行 并发并且是同步的。到目前为止,它只有 1 个 for 循环读取每个文件,然后对每个文件进行处理。
我相信这个算法 运行s sequentially 这不是我想要的...... 我考虑过创建一个外部 for 循环,在其中放置 wait(null) 和 read 命令。但是当我尝试时它不起作用,没有产生输出。目前我在父进程中有 wait(null) 命令。
有什么建议吗?
代码:
int main(int argc, char *argv[])
{
// ATTRIBUTES //
int freq[argc-1], ipc[argc][2], nbytes, i;// freq of words, pipes, counters
ssize_t errorfi;
char readbuffer[9999];
char** k = malloc(50);
char** op = malloc(50);
if(argc == ONE) { // there are no files given, throw error and close
fprintf(stderr, "There are no files found from %s\n", argv[0]);
exit(0);
}
for(i = 1; i < argc; i++) // creates pipes for ipc
pipe(ipc[i]);
pid_t pids[argc-1]; // array of pids
for(i = 1; i < argc; i++) { // reads input after position 0(a.out)
pid_t pid = fork(); // creates process
pids[i-1] = pid;
if( pid < 0 ) { // bad fork process: error
perror("bad fork");
exit(0);
}
else if(pid > 0) { //parent process
close(ipc[i][1]);
wait(NULL);
nbytes = read(ipc[i][0], readbuffer, sizeof(readbuffer));
if(nbytes > 0)
printf("%s\n", readbuffer);
}
else if(pid == 0) { // child process
close(ipc[i][0]);
k = inputReader(argv[i]); // finds filename,w1,w2,w3,uniqueWords
char info[50] = "";
strcat(info, k[0]);
strcat(info, " ");
strcat(info, k[1]);
strcat(info, " ");
strcat(info, k[2]);
strcat(info, " ");
strcat(info, k[3]);
strcat(info, " ");
strcat(info, k[4]);
int uniqueWordint = atoi(k[4]);
freq[i-1] = uniqueWordint; // freq of all uniqueWords
errorfi = write(ipc[i][1], info, strlen(info)+1); // writes info to pipe i
if (errorfi < 0 ) {
fprintf(stderr, "error found when writing in pipe errofi: %d\n", errorfi);
exit(0);
}
exit(0); // close process
} // closes child process
} // closes for-loop for each process
for(j = 0; j < argc-1; j++) {
wait(2); // if i put read command here it won't work
}
return(0); // close main
}
这确实是一个顺序执行。父进程进入一个循环,fork一个子进程,直到那个子进程完成后才会继续下一个循环。
您可以创建一个大小为 argc
的 pid_t
数组来存储每个 fork()
的 return 值。
在 "for-loop for each process" 之后创建一个新循环,其中父进程将使用 wait(2)
or waitpid(2)
等待他的所有子进程,具体取决于您是否需要按特定顺序处理每个子进程的结果,并且继续处理它们(read
ing 或任何需要的东西。