2016-03-13 40 views
0

我有一个家庭作业,需要使用管道在进程之间发送一串字符串。如何使用管道发送动态分配的字符串

当我发送编译时间从子进程到使用管道的主进程创建的字符串,它被成功发送。这是我在主要和子过程中所做的。

子过程:

char* str ="from child"; 
    int lengthOfString=strlen(str)+1;//+1 for null terminator 

    write(pipes[0][1],&lengthOfString,sizeof(int));//send the length of string beforehand 
    write(pipes[0][1],&str,lengthOfString); //send the actual string 

主要过程:

int numberOfChar; 
    char* buffer; 
    buffer=(char*)malloc(sizeof(char)*15); 
     read(pipes[0][0],&numberOfChar,sizeof(int));//get length of upcoming string 
     read(pipes[0][0],&buffer,numberOfChar);//read the actual sting 
     printf("received from pipe :%s\n",buffer); 

但是如果我试着与动态分配的串同样的事情,我只收到NULL作为字符串在主处理。这是我做的。

子过程:

char* dynamicallyAllocatedString=(char*)malloc(sizeof(char)*strlen(str)); 
    strcpy(dynamicallyAllocatedString,str); 
    int lengthOfString=strlen(dynamicallyAllocatedString)+1;//+1 for null terminator 

    write(pipes[0][1],&lengthOfString,sizeof(int));//send the length of string beforehand 
    write(pipes[0][1],&dynamicallyAllocatedString,lengthOfString); //send the actual string 

主要过程:

read(pipes[0][0],&numberOfChar,sizeof(int));//get length of upcoming string 
     buffer=(char*)malloc(sizeof(char)*numberOfChar); 
     read(pipes[0][0],&buffer,numberOfChar);//read the actual sting 
     printf("received from pipe :%s\n",buffer); 

下面是完整的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
int main(int argc,char * argv[]) 
{ 
pid_t pid; 
int numberOfPipe=1; 
int ret; 
int c; 
int pipeNumber=-1; 
int** pipes= (int**)malloc(numberOfPipe*sizeof(int)); 
for(c=0;c<numberOfPipe;c++)//create pipe for each process 
{ 
    pipes[c]= (int*)malloc(sizeof(int)*2); 
    ret = pipe(pipes[c]); 
    if(ret==-1) 
     { 
      perror("pipe error"); 
      exit(1); 
     } 
} 


for(c=0;c<numberOfPipe;c++)//create child process 
{ 
pid = fork(); 
pipeNumber++; 
if(0==pid) 
{ 
    break; 
} 
} 
if(0==pid) 
{ 
    // Child process 
    int i=0; 
    char* str ="from child"; 
    char* dynamicallyAllocatedString=(char*)malloc(sizeof(char)*strlen(str)); 
    strcpy(dynamicallyAllocatedString,str); 
    int lengthOfString=strlen(dynamicallyAllocatedString)+1;//+1 for null terminator 
    close(pipes[pipeNumber][0]); //close read side 

    write(pipes[pipeNumber][1],&lengthOfString,sizeof(int));//send the length of string beforehand 
    write(pipes[pipeNumber][1],&dynamicallyAllocatedString,lengthOfString); //send the actual string 

    close(pipes[pipeNumber][1]); //close write side 
    exit(0); 
} 
else 
{ 
    //main process 
    printf("main process\n"); 

    int numberOfChar; 
    char* buffer; 


    for(c=0;c<numberOfPipe;c++)//close write side of each pipe 
    { 
     close(pipes[c][1]); 
    } 

    for(c=0;c<numberOfPipe;c++)//iterate each pipe 
    { 
     read(pipes[c][0],&numberOfChar,sizeof(int));//get length of upcoming string 
     buffer=(char*)malloc(sizeof(char)*numberOfChar); 
     read(pipes[c][0],&buffer,numberOfChar);//read the actual sting 
     printf("received from pipe :%s\n",buffer); 
    } 

    for(c=0;c<numberOfPipe;c++)//close read side of each pipe 
    { 
     close(pipes[c][0]); 
    } 
} 

printf("end"); 
return 0; 

}

我能做些什么来得到实际字符串而不是NULL? 谢谢。

+0

'malloc(sizeof(char)* strlen(str))'这不足以存储C字符串。如果你打算离开终端的'\'0',那么一定要在两边适当地处理“串”。 –

回答

0
write(pipes[0][1],&dynamicallyAllocatedString,lengthOfString); 

您将指针传递给动态分配的字符串,而不是指向实际字符串的指针。

你的代码中的第二个问题是你没有检查read()或write()的返回值。当您使用管道时,并不保证您的整个请求的写入或读取都会成功。

read()和write()都可以返回比请求更少的读取或写入字节。您的代码必须检查返回值并采取适当的措施。如果不这样做,最终会导致难以定位和调试的细微错误。

此外,对于您的“编译时”情况,您声称工作正常,不会出于同样的原因。要么这不是您使用的实际代码,要么您未能检测到相同的错误。