这是一个关于管道和进程的小C程序,父进程将创建2个子进程,第一个将读取链中的数字,第二个将读取字母。我开始要求WORD,我没有添加保护,这只是一个测试,所以让我们说大约20个字母,然后父进程将在第一个管道中写入数字,并在第二个管道中写入字母,然后他将创建一个孩子使用fork(),如果他是孩子,他将从第一个管道读取数字,如果他是父亲,那么他将创建另一个孩子,阅读这些字母。
# include <stdio.h>
# include <unistd.h>
# include <string.h>
# include <fcntl.h>
main()
{
printf("I am the father, I will create 2 sons, the first will read the numbers , the second will read the letters\n");
char * word;
printf("please type the word: \n");
scanf("%s",word);
printf("Now 2 pipes will be created\n");
int fd1[2];
int fd2[2];
pipe(fd1); pipe(fd2);
printf("Now the father will write numbers in the first pipe, and letters in the second\n");
int i;
char numbers[20]; int j=0;
char caracters[20]; int k=0;
for (i=0;i<20;i++)
{
if(word[i]>='0' && word[i]<='9') //if number
{
close(fd1[0]); //closing reading
write(fd1[1],word[i],2);
}
else
{
close(fd2[0]);
write(fd2[1],word[i],2);
}
}
printf("The father has wrote in the 2 pipes, now its time for the sons\n");
int f=fork();
if(f==0) //first son
{
for(i=0;i<20;i++) {
close(fd1[1]); //closing writing
read(fd1[0],numbers[j],strlen(numbers[j])+1);
j++;
}
printf("first son read everything, he got %d Numbers\n", j);
}
else
{
f=fork();
if(f==0)
{
for(i=0;i<20;i++) {
close(fd2[1]); //closing writing
read(fd2[0],caracters[k],strlen(caracters[k])+1);
k++;
}
printf("second son read everything, he got %d caracters\n", j);
}
}
编译后:
In function 'main':
Line 25: warning: passing argument 2 of 'write' makes pointer from integer without a cast
Line 31: warning: passing argument 2 of 'write' makes pointer from integer without a cast
Line 41: warning: passing argument 1 of 'strlen' makes pointer from integer without a cast
Line 41: warning: passing argument 2 of 'read' makes pointer from integer without a cast
Line 54: warning: passing argument 1 of 'strlen' makes pointer from integer without a cast
Line 54: warning: passing argument 2 of 'read' makes pointer from integer without a cast
Line 60: error: expected declaration or statement at end of input
答案 0 :(得分:2)
write
和read
的原型是
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
write
/ read
的参数2应该是一个指针。但是你发送的是一个字符(实际上是一个整数)word[i]
和numbers[i]
即使您的strlen
此外,将word
声明为数组而不仅仅是指针。否则,您将写入指针所指向的随机位置。或者如果你想把它作为一个指针,malloc
为它留下一些记忆。
完成所有这些操作后,只需将word
,numbers
代替numbers[j]
或words[i]
传递给投诉的函数
编辑:您的上一个for
语句for(i=0;i<20;i++)
也没有右括号,因此Line 60: error: expected declaration or statement at end of input
错误
答案 1 :(得分:0)
而不是:
write(fd1[1],word[i],2);
这样做:
write(fd1[1],(void*)&word[i],2);
...即,将一个POINTER传递给数据的位置,而不是数据本身的值。