2016-04-24 16 views
-1

私は、Cでプロセスと名前付きパイプを使ってクライアントサーバー通信用のコードを書いています。問題は、リモートLinuxマシンで自分のコードをコンパイルすると、何も印刷せずに自分の子プロセスを強制終了させるということです。Linux環境でMallocが子プロセスを終了させる

私の子プロセスが停止する行は次のとおりです:(* c)= malloc(sizeof(channel));

私はRAMを使い果たしてもメモリを使いません。このコードはcygwin環境でうまく動作します!

これを解決する方法はありますか?

int create_cha(channel **c,int id,char *n){ 
printf("here\n"); 
(*c)=malloc(sizeof(channel)); //(channel*) 
if (*c==NULL) 
{ 
printf("malloc error\n"); 
return 1; 
} 

printf("here\n"); 
(*c)->next=NULL; 
printf("here\n"); 
(*c)->ch_id=id; 
printf("here\n"); 
(*c)->num_messages=0; 
strcpy((*c)->name,n); 
printf("here\n"); 
(*c)->m=NULL; 
return 0; 
} 

int main(int argc , char * argv[]){ 
    //Declaring variables for paths 
    char path[64]; 
    char path_id[64]; 
    char pip_self_1[64]; //client to server 
    char pip_self_2[64]; //server to client 
    char pip_board_1[64]; //server to boardpost 
    char pip_board_2[64]; //boardpost to server 
    pid_t pid; //process id; 

    char str[10]; 
    char message_sent[MSG_SIZE]; 
    char message_recieve[MSG_SIZE]; 
    pid_t status_server; 
    pid_t status_client; 
    //vars needed in process functions 
    int id; 
    char name; 
    //file desctriptors 
    int s_r_c; //server reads client :1 
    int s_w_c; //server writes in client :2 
    int c_w_s; //client writes in server :3 
    int c_r_s;//client reads from sever :4 

    int status; 
    //checking if argument exists 
    if (argc!=2) 
    { 
     printf("No right arguments given : Path not defined"); 
     return 1; //error 
    } 

    memcpy(path, argv[1],strlen(argv[1])+1); 

    memcpy(pip_self_1, path,strlen(argv[1])+1); 
    strcat(pip_self_1,"/_self_1\0"); 

    memcpy(pip_self_2, path,strlen(argv[1])+1); 
    strcat(pip_self_2,"/_self_2\0"); 

    memcpy(pip_board_1, path,strlen(argv[1])+1); 
    strcat(pip_board_1,"/_board_1\0"); 

    memcpy(pip_board_2, path,strlen(argv[1])+1); 
    strcat(pip_board_2,"/_board_2\0"); 

    //creating the named pipe for client-server communication 
     if(mkfifo(pip_self_1,0666)==-1){ 
     printf("error: creating fifo 1\n"); 
     printf("%d (%s)\n", errno, strerror(errno)); 
     } 
     if(mkfifo(pip_self_2,0666)==-1){ 
     printf("error: creating fifo 2\n"); 
     printf("%d (%s)\n", errno, strerror(errno)); 
     } 


    pid=fork(); 
    switch(pid){ 
     case -1: perror("fork error"); 
       break; 
     case 0: 
      printf("i am in child process\n"); 
      channel **root; 
      create_cha(root,0,"root"); 

      //opening the pipes to write and read to/from client 

      if((s_r_c = open(pip_self_1, O_RDWR | O_NONBLOCK))<0){ 
      printf("error: opening in pipe %s in 1 for s_r_c\n",pip_self_1); 
      printf("%d (%s)\n", errno, strerror(errno)); 
      //return 1; 
      } 
      else{ 
      printf("open succeded in 1 with fd %i for s_r_c \n",s_r_c); 
      } 
      if((s_w_c= open(pip_self_2, O_RDWR | O_NONBLOCK))<0){ 
      printf("error: opening in pipe %s in 2 for s_w_c \n",pip_self_2); 
      printf("%d (%s)\n", errno, strerror(errno)); 
      //return 1; 
      } 
      else{ 
      printf("open succeded in 2 with fd %i for s_w_c \n",s_w_c); 
      } 
      //end opening pipes 

      printf("out of child process\n"); 
      break; 
     default : 
       printf("i am in parent process\n"); 
       //opening pipes to read/write from/to server 
       if((c_w_s = open(pip_self_1, O_RDWR | O_NONBLOCK))<0){ 
       printf("error: opening in pipe %s in 3\n",pip_self_1); 
       printf("%d (%s)\n", errno, strerror(errno)); 
       return 1; 
      } 
      else{ 
      printf("open succededin 3 with fd %i for c_w_s \n",c_w_s); 
      } 
      if((c_r_s = open(pip_self_2, O_RDWR | O_NONBLOCK))<0){ 
       printf("error: opening in pipe %s in 4\n",pip_self_2); 
       printf("%d (%s)\n", errno, strerror(errno)); 
       return 1; 
       } 
       else{ 
      printf("open succeded in 4 with fd %i for c_r_s \n",c_r_s); 
      } 
      pid = wait(&status); 
    printf("*** Parent detects process %d is done ***\n", pid); 
    printf("*** Parent exits ***\n"); 
      //endin opening pipes 
       }  

    return 0; 
} 
+1

私はそれが 'errno'にある行ではないと思いますか?プロセスがどのくらい正確に終了していますか?そして、C++タグを削除します。これはC++とは関係ありません。 – coredump

+0

あなたは 'root'を初期化することはありませんが、' create_cha'で逆参照します。 –

+2

これはC++ではありません.C++としてタグ付けしないでください。 –

答えて

1

rootには、2つの初期化されていない間接レベルがあります。それを1に減らす方が良い。

channel *root; 
create_cha(&root,0,"root"); 
+0

これは何かの理由でこれは魔法の<3 !!!!なぜなのかご存知ですか ? – panos

+0

あなたはポインターへのポインターを持っていたので、まずポインタをmallocしてから、それが指すチャンネルをmallocしなければなりませんでした。簡単に1つのレベルを持つことができます。 – stark

関連する問題