程序卡在 read() using Pipe() in c
Program stuck on read() using Pipe() in c
我的代码如下:
我正在使用 C 语言的管道系统调用。这里我的程序卡在 read(the_pipe_1[0],recieved,20);
行前:
printf("DUCKKKKKK\n");
输出是:
In parent
Enter the value
In Child
代码:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include<sys/wait.h>
int isPalindrome(char str[]);
int main(int argc, char const *argv[]) {
int the_pipe_1[2];
int the_pipe_2[2];
char recieved[20];
char input[20];
char pal[10];
int palchid;
int pipeVal = pipe(the_pipe_1);
if (pipeVal == -1 ) {
printf("Pipe 1 failed\n");
}
if (pipe(the_pipe_2) == -1 ) {
printf("Pipe 2 failed\n");
}
int forkVal = fork();
if (forkVal > 0) {
printf("In parent \n");
close(the_pipe_1[0]);
printf("Enter the value\n");
gets(input);
write(the_pipe_1[1],(char) input,20);
wait(NULL);
close(the_pipe_2[1]);
read(the_pipe_2[0],pal,10);
if(pal == "0")
{
printf("Not plaindrome\n");
}
else
printf("Plaindrome\n");
}
else if(forkVal == 0)
{
printf("In Child\n");
close(the_pipe_1[1]);
read(the_pipe_1[0],recieved,20);
printf("DUCKKKKKK\n");
printf("Val of recieved %s \n",&recieved );
palchid = isPalindrome(recieved);
close(the_pipe_2[0]);
write(the_pipe_2[1],(char)palchid,10);
}
return 0;
}
int isPalindrome(char str[])
{
int l = 0;
int h = strlen(str) - 1;
while (h > l)
{
if (str[l++] != str[h--])
{
return 0;
}
}
return 1;
}
简单。将行更改为:
write(the_pipe_1[1], input, 20);
而且效果很好。
说明:
当您将输入(通常是 32 位指针)转换为 char(8 位)时,您创建了一个指向非法地址的指针。在某些访问中,这会导致分段错误。例如,您可以尝试:
//segmentation fault
printf("input - %s\n", (char)input);
但是对于write(),它的工作方式不同(没有深究原因),反而导致程序卡住了
PS。
此行永远不会为真:
if(pal == "0")
我的代码如下:
我正在使用 C 语言的管道系统调用。这里我的程序卡在 read(the_pipe_1[0],recieved,20);
行前:
printf("DUCKKKKKK\n");
输出是:
In parent
Enter the value
In Child
代码:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include<sys/wait.h>
int isPalindrome(char str[]);
int main(int argc, char const *argv[]) {
int the_pipe_1[2];
int the_pipe_2[2];
char recieved[20];
char input[20];
char pal[10];
int palchid;
int pipeVal = pipe(the_pipe_1);
if (pipeVal == -1 ) {
printf("Pipe 1 failed\n");
}
if (pipe(the_pipe_2) == -1 ) {
printf("Pipe 2 failed\n");
}
int forkVal = fork();
if (forkVal > 0) {
printf("In parent \n");
close(the_pipe_1[0]);
printf("Enter the value\n");
gets(input);
write(the_pipe_1[1],(char) input,20);
wait(NULL);
close(the_pipe_2[1]);
read(the_pipe_2[0],pal,10);
if(pal == "0")
{
printf("Not plaindrome\n");
}
else
printf("Plaindrome\n");
}
else if(forkVal == 0)
{
printf("In Child\n");
close(the_pipe_1[1]);
read(the_pipe_1[0],recieved,20);
printf("DUCKKKKKK\n");
printf("Val of recieved %s \n",&recieved );
palchid = isPalindrome(recieved);
close(the_pipe_2[0]);
write(the_pipe_2[1],(char)palchid,10);
}
return 0;
}
int isPalindrome(char str[])
{
int l = 0;
int h = strlen(str) - 1;
while (h > l)
{
if (str[l++] != str[h--])
{
return 0;
}
}
return 1;
}
简单。将行更改为:
write(the_pipe_1[1], input, 20);
而且效果很好。
说明: 当您将输入(通常是 32 位指针)转换为 char(8 位)时,您创建了一个指向非法地址的指针。在某些访问中,这会导致分段错误。例如,您可以尝试:
//segmentation fault
printf("input - %s\n", (char)input);
但是对于write(),它的工作方式不同(没有深究原因),反而导致程序卡住了
PS。 此行永远不会为真:
if(pal == "0")