我正在尝试编写一个程序,父进程将获取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);
}
答案 0 :(得分:2)
第二次等待()是多余的;孩子没有自己的孩子等待。第二个'退出(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);
关闭管道的未使用端 - 这是使工作正常的关键步骤。
代码似乎正在计数。当我测试时,它可以下架。为什么你怀疑它不起作用?