2013-05-01 79 views
0

写入或读取功能始终切断除第一个字母以外的所有内容。有谁知道为什么? 我有一个父亲和一个与管道沟通的孩子。 我在写入变量之前检查了它的变量,它没有被切断。C管道通信写入/读取文本的功能切入

#include<dirent.h> 
#include<string.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<time.h> 

int main(int argc, char *argv[]) 
{ 
    time_t tm_now; 
    struct tm *ptm_now; 
    time(&tm_now); 
    ptm_now = localtime(&tm_now); 

    int chanal_father[2]; 
    int chanal_child[2]; 
    pipe(chanal_father); 
    pipe(chanal_child); 
    char message_child[50]; 
    char message_father[50]; 
    char message_return[50]; 


    if (fork()==0) 
    { 
     read(chanal_father[0], message_father, strlen(message_father)+1); 
     if(strcmp(message_father, "day") == 0) { 
      int day = ptm_now->tm_mday; 
      int month = (ptm_now->tm_mon)+1; 
      int year = (ptm_now->tm_year)-1900;   
      sprintf(message_return, "%2d.%2d.%2d", day, month, year); 
     } 
     else { 
      sprintf(message_return, "unknown function!"); 
     } 

     write(chanal_child[1],message_return, strlen(message_return)+1); 
     exit(0); 
    } 

    write(chanal_father[1], argv[1], strlen(argv[1])+1); 
    read(chanal_child[0], message_child, strlen(message_child)+1); 
    printf("%s\n", message_child); 
} 
+0

的strlen(message_father)+1大概等于到1?该字符串未初始化。你只能读一个字节。可变长度的消息不适合管道。 – user2035147 2013-05-01 23:18:28

回答

1

不要使用strlen()来获取数组的大小,请使用sizeof()。的rember读取()将读到 '计数' 字节:

ssize_t read(int fd, void *buf, size_t count); 

此外,为清楚起见,你可能要构建程序如下:

pid_t pid = fork(); 

if(pid == 0){ 

    ... 

}else{ 

    ... 

} 
+0

不知道有什么区别,但它的工作原理! :D – user1069968 2013-05-01 23:30:46

+0

区别在于strlen()将决定字符串的长度。 C中的字符串根据定义是一个空终止数组。由于您的数组未初始化,strlen()将返回长度为0。 – PurpleAlien 2013-05-01 23:31:52

+0

顺便说一句,那个{}块应该在你的代码中,否则这个代码将由父母和孩子执行。 – PurpleAlien 2013-05-01 23:33:06