我编写了一个C程序,它应该创建一定数量的子进程,每个子进程都必须从一个字符串中更改1个字母。从键盘读取字符串和子进程数。
例如:
输入:
3 Apples
输出:
Applex Appldx Apqldx
我的问题是:只有父母更改了一封信,而孩子则没有。 不确定我做错了什么。非常感谢帮助,提前谢谢!
编辑: 我觉得我不够清楚。我想用管道来做。 它应该像这样工作:父级更改一个字母,然后第一个子级获取父级修改的字符串并再更改一个字母。 第二个子进行第一个修改后的字符串(2个字母已经更改)并再更改一个,依此类推。我是C的新手,我不太确定它是如何工作的,特别是管道。 孩子也可以通过管道链接到他们之间,或者只能链接到父母,它必须是这样的:第一个孩子改变一个字母,将字符串返回给父母,然后第二个孩子从那里读取,修改信件并退回。 如果是这样的话,有没有办法确保不会发生这种情况:苹果变成AppleD然后是AppleX然后变成AppleQ?
这是我的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include <sys/wait.h>
void error(char* msg)
{
fprintf(stderr, "%s\n", msg);
exit(1);
}
static void modify(char msg[]) {
srand(time(NULL));
int pos1=rand()%((int)strlen(msg));
srand(time(NULL));
int pos2=rand()%26;
srand(time(NULL));
int big=rand()%2;
if(big==1) {
msg[pos1]=(char)(((int)'A')+pos2);
}
else {
msg[pos1]=(char)(((int)'a')+pos2);
}
return;
}
int main(int argc, char *argv[])
{
if(argc!=3) {
error("Wrong number of arguments\n");
}
int nrch;
nrch=atoi(argv[1]);
char* msg=argv[2];
printf("Parent: erhalten: %s\n", msg);
int i=0;
modify(argv[2]);
printf("Parent: weiter: %s\n", msg);
srand(time(NULL));
pid_t pids[10];
int fd[2];
/* Start children. */
for (i = 0; i < nrch; ++i) {
if (pipe(fd) == -1) {
error("Can’t create the pipe");
}
if ((pids[i] = fork()) < 0) {
error("Can't fork process");
}
else if (pids[i] == 0) {
//dup2(fd[1], 1);
//close(fd[0]);
printf("child%d: erhalten: %s\n", (i+1), msg);
modify(msg);
printf("child%d: weiter: %s\n", (i+1), msg);
exit(0);
}
}
/* Wait for children to exit. */
int status;
pid_t pid;
while (nrch > 0) {
pid = wait(&status);
printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
--nrch;
}
}