【发布时间】:2016-05-05 11:41:03
【问题描述】:
这是我的代码的样子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
char* reverseString(char*);
int main(void)
{
pid_t id;
int fd[2], nbytes;
char string[80];
char readbuffer[80];
char* reversed;
pipe(fd);
if((id = fork()) == -1)
{
perror("fork");
exit(1);
}
if(id != 0)
{
close(fd[0]);
printf("PARENT\n--------------------\n");
// printf("fork: %d\n", id);
printf("my pid is %d\n", getpid());
// printf("my parent's pid is %d\n", getppid());
printf("enter string: ");
scanf("%s", string);
write(fd[1], string, (strlen(string)+1));
}
else
{
close(fd[1]);
printf("CHILD\n--------------------\n");
// printf("fork: %d\n", id);
printf("my pid is %d\n", getpid());
// printf("my parent's pid is %d\n", getppid());
nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
printf("Received string: %s\n", readbuffer);
reversed = reverseString(readbuffer);
printf("Reversed string: %s\n", reversed);
pid_t id2;
int fd2[2];
char readbuffer2[80];
pipe(fd2);
if((id2 = fork()) != 0)
{
close(fd2[0]);
printf("My pid: %d\n", getpid());
write(fd2[1], reversed, (strlen(reversed)+1));
}
else
{
close(fd2[1]);
printf("My Child's PID: %d\n", getpid());
nbytes = read(fd2[0], readbuffer2, sizeof(readbuffer2));
printf("Received string2: %s\n", readbuffer2);
}
}
return (0);
}
char* reverseString(char* str)
{
char reversed[80];
int n = strlen(str);
for(int i = n - 1, j = 0; i >= 0; i--, j++)
reversed[j] = str[i];
reversed[n] = '\0';
return reversed;
}
我正在尝试将反向字符串通过管道传输到在第二个进程中分叉的第三个进程中,但它没有显示出来。
另外,当我在输入后执行scanf 时,会继续打印,直到打印出子部分,然后我输入字符串。我如何防止它打印所有内容。它看起来像这样:
PARENT
--------------------
my pid is 821
enter string: CHILD
--------------------
my pid is 822
$
【问题讨论】:
-
在child中,将printfs放在
read之后,这样child在打印任何东西之前等待输入。 -
感谢@user3386109 修复它!
-
代码中有几个问题。 1) 你的编译器应该告诉你返回一个指向
reversestring()函数堆栈中的char数组的指针的问题(如此有效,char数组超出范围/函数退出时不再存在) 2) 对fork()的第二次调用假定调用成功。假设对系统函数的调用是成功的,这绝不是一个好主意。 -
这一行:
scanf("%s", string);不限制用户可以输入的字符数,因此用户可能会超出输入缓冲区string,从而导致未定义的行为,并可能导致段错误事件。同样在reverseString()函数中,假设(不是安全的假设)传入的字符串少于 80 个字符。建议:scanf("%79s", string);其中 79 允许scanf()将 NUL 字节附加到通过 '%s' 格式说明符输入的字符。