我正在尝试编写一个程序,让父进程将参数传递给main(),并通过管道将其中的字符逐个发送给子进程(为每个字符编写一个调用)。子进程将对父进程发送给它的字符数进行计数,并打印出它从父进程收到的字符数。子进程不应该以任何方式使用main()的参数。孩子应该正常返回,而不是让父母杀死孩子。
我计算的参数正确吗?我一次只发送一个参数,我是在收割孩子吗?
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define size = 100;
int main(int argc, char *argv[])
{
int i, count =0;
int c;
int fdest[2]; // for pipe
pid_t pid; //process IDs
char buffer[BUFSIZ];
if (pipe(fdest) < 0) /* attempt to create pipe */
perror( "pipe" );
if ((pid = fork()) < 0) /* attempt to create child / parent process */
{
perror( "fork" );
}
/* parent process */
else if (pid > 0) {
close(fdest[0]);
for (i=1; i < argc; ++i)
{
for (c=0; c < strlen(argv[i]); ++c) {
write(fdest[1], &argv[i][c], 1);
}
}
close(fdest[1]);
wait(NULL);
exit(0);
} else {
/* child Process */
close(fdest[1]);
while (read(fdest[0], &buffer, 1) > 0)
{
count++;
}
printf("\nchild: counted %d characters\n", count);
}
wait(NULL);
exit(0);
}发布于 2010-03-14 05:55:22
第二个wait()是多余的;孩子没有自己的孩子要等待。第二个“exit(0);”可以替换为“return(0);”。您也可以省略前面的'exit(0);‘。
'#define size = 100;‘未使用,这也是因为'=’使其在大多数情况下不可用(分号也不是一个好主意--宏很少以分号结尾)。它应该是'#define size 100‘或'enum { size = 100 };’。通常,人们使用大写名称来表示“清单常量”,因此使用了“enum { SIZE = 100 };”。
如果你一次只读一个字符,你真的不需要一个BUFSIZ大小的缓冲区(通常是512或更大)。
此外,做'for (c = 0; c < strlen(argv[c]); c++)‘也不是一个好主意,因为这会在每次迭代中计算字符串的长度。将其替换为以下任一项:
for (const char *str = argv[i]; *str != '\0'; str++)
write(fdest, str, 1);
for (c = 0, len = strlen(argv[i]); c < len; c++)
write(fdest[1], &argv[i][c], 1);关闭未使用的管道末端-这是使事情正常工作的关键一步。
代码似乎可以正确计数。当我测试它时,它在货架上就能正常工作。为什么你怀疑它不工作?
https://stackoverflow.com/questions/2439996
复制相似问题