2013-10-17 33 views
1

我試圖解決遺留代碼中的一些錯誤。這是代碼:C stdin不起作用

#include <stdio.h> 
#include <string.h> 
#include <pthread.h> 
#include <sys/msg.h> 

#include "libSvr.h" 

#define CONEC 3 
#define CONFIG 4 

typedef struct { 
    long type; 
    int cmd; 
    int id; 
    char data[7000]; 
} msg; 

typedef struct { 
    int id[100]; 
    unsigned long ip[100]; 
    int type[100]; 
    char name[100][20]; 
    int num; 
} conec; 

typedef struct { 
    char ip; 
    char svr; 
} param_cfg; 

typedef struct { 
    unsigned long my_ip; 
    unsigned long svr_ip; 
} tcp_cfg; 

msg client, server; 
conec conec_tab; 

param_cfg param; 
tcp_cfg setup; 

void *Receive_MSG(void *arg) { 
    int i; 
    while (1) { 
     if (msgrcv(msgkey,&client,7008,2,0) != -1) { 
      switch (client.cmd) { 
       case CONEC: 
        memmove((char*)&conec_tab,client.data,sizeof(conec_tab)); 
        printf("\n%d\n",conec_tab.num); 
        break; 
       case CONFIG: 
        switch (conec_tab.type[client.id]) { 
         case 0: 
          memmove((char*)&param,&client.data[sizeof(param_cfg)],sizeof(param_cfg)); 
          printf("------------PARAM Config------------\n"); 
          printf("%c\n%c\n\n",param.ip,param.svr); 
          break; 
         case 1: 
          memmove((char*)&setup,client.data,sizeof(tcp_cfg)); 
          printf("\n------------Setup------------\n"); 
          printf("%s\n",Inet_ntoa(setup.my_ip)); 
          break; 
        } 
      } 
     } 
    } 
} 

void send_msg() { 
    msgsnd(msgkey,&(server.type),7008,0); 
} 

void Process(char *command) { 
    server.type = 1; 

    if (!strncmp(command,"text",8)) { 
     server.cmd = 1; 
     send_text(); 
     send_msg(); 
    } 
    else if (!strncmp(command,"image",9)) { 
     server.cmd = 2; 
     send_image(); 
     send_msg(); 
    } 
    else 
     printf("\nCommand not found.\n"); 
} 

int main() 
{ 
    int i; 
    char cmd[100]; 
    msgkey=msgget(100,0); 

    if (msgkey == -1) { 
     printf("ERROR msgkey!!"); 
     exit(1); 
    } 

    pthread_t receive; 
    pthread_create(&receive,NULL,Receive_MSG,NULL); 

    do { 
     printf("Enter a command -> "); 

     if (fgets(cmd,100,stdin) == NULL) { 
      printf("error"); 
      exit(1); 
     } 

     cmd[strlen(cmd)-1]='\0'; 
     if ((strcmp(cmd,"exit")) && (strcmp(cmd,""))) 
      Process(cmd); 

    } while (strcmp(cmd,"exit")); 

    return 0; 
} 

libSvr.h代碼:

#ifndef LIBSVR_H 
#define LIBSVR_H 

#pragma pack(push,1) 
#pragma pack(1) 


extern "C" void send_text(); 

extern "C" void send_image(); 


#pragma pack(pop) 

#endif 

螺紋receive剛剛從隊列中的ID msgkey另一個應用程序接收一些郵件並打印一些文字。

問題是當我進入do while while循環時,我需要獲得一些用戶輸入,fgets失敗...當我打印錯誤(使用errno)時,我看到它是一個錯誤的文件描述符錯誤(EBADF)。

Process函數獲取命令a調用相應的函數,即基本上會通過套接字發送一些數據。這些由Process調用的函數來自一個lib(libSvr),用C++編寫,函數C extern-ed。

我使用的是gcc 4.7.2的ubuntu 12.10機器。

我試着看預處理器(用gcc -E)和stdin後的代碼仍然顯示爲stdin。我試圖打印fileno(stdin)的輸出,它是0(我看到某個地方它是正確的值),然後我試圖以這種方式撥打fgetsfgets(cmd,100,0)。但沒有任何工作。

任何人都知道發生了什麼?

謝謝!

編輯:

包括了所有的代碼。

我試過打電話gets(),scanf()read(),並且還創建了線程(pthread_create),但沒有任何變化。

我跑的命令strace -s2000 -etrace=open,close <MYPROGRAM>,這是輸出:

open("/mnt/hgfs/projects/tls/i686/sse2/cmov/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/tls/i686/sse2/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/tls/i686/cmov/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/tls/i686/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/tls/sse2/cmov/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/tls/sse2/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/tls/cmov/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/tls/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/i686/sse2/cmov/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/i686/sse2/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/i686/cmov/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/i686/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/sse2/cmov/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/sse2/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/cmov/libSvr.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/mnt/hgfs/projects/libSvr.so.1", O_RDONLY|O_CLOEXEC) = 3 
close(3)        = 0 
open("/mnt/hgfs/projects/libpthread.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 
close(3)        = 0 
open("/lib/i386-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 
close(3)        = 0 
open("/mnt/hgfs/projects/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 
close(3)        = 0 
open("/mnt/hgfs/projects/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/usr/lib/i386-linux-gnu/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3 
close(3)        = 0 
open("/mnt/hgfs/projects/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/lib/i386-linux-gnu/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3 
close(3)        = 0 
open("/mnt/hgfs/projects/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/lib/i386-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3 
close(3)        = 0 
close(0)        = 0 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 
close(0)        = -1 EBADF (Bad file descriptor) 

Enter a command -> 
errorEnter a command -> 
errorEnter a command -> 
errorEnter a command -> 

因此,stdin文件描述符beeing封閉的,但現在我需要知道它是beeing關閉。

我正在學習一些howto和strace的man page,因爲我從來沒有使用過它。

任何幫助和提示將受到歡迎。

再次感謝!

+0

難道是合理的(即沒有太多的代碼),以提供必要把這個在主附加_relevant_部分()函數並運行它? – ryyker

+2

那裏有#include 嗎? read()'怎麼辦?你能從'stdin'讀'()'嗎? – 2013-10-17 21:23:16

+2

當您編輯您的問題時,例如要添加一些代碼,請確保使用__whitespaces__進行縮進。簡單地用適當的空白序列來替換你的標籤頁,這會讓我們更容易閱讀;)(PS:4 whitespaces = 1 indentation level) – Rerito

回答

1

我讓你的代碼運行一些變化。我沒有設法讓系統V-stuff工作,但是我知道它可以在不崩潰的情況下讀取命令。

我認爲在你的程序中系統V-stiff的初始化是錯誤的,並且會產生未定義的行爲。

所有的close(0)-s可能來自某個地方的服務器線程,它不會從錯誤的while循環中斷開。

的System V的初始化(我不知道如何使用這個,真的,只是看的人的頁面),我不喜歡這樣的:

// msg_key is declared above the server-code (used by both) like `key_t msg_key` 
    msg_key = ftok ("/home/atle/prog/test.c", 'A'); 
    if (msg_key == -1) { 
      printf ("ftok error: %s\n", strerror(errno)); 
      exit(1); 
    } 
    msgkey = msgget(msg_key, IPC_CREAT); 

    if (msgkey == -1) { 
      printf ("msgget error: %s\n", strerror(errno)); 
      exit(1); 
    } 

在服務器上,我不喜歡這樣的:

int msgkey_server = msgget(msg_key, 0); 
    if (msgkey_server == -1) { 
      printf ("Server msgget error: %s\n", strerror(errno)); 
      exit(1); 
    } 

    while (1) { 
      printf ("Server loop\n"); 
      if (msgrcv(msgkey_server,&client,sizeof(client),0,0) == -1) { 
        printf ("Server read error: %s\n", strerror(errno)); 
        exit(1); 
      } 
      else { 
        // MSG READ OK 
      } 

BTW:

當你傳遞一個結構來連接其大小的命令,你應該總是用戶sizeof()像我一樣在這裏,而不是手工編寫的大小(導致問題)。

額外BTW:

您需要的錯誤號頭:

#include <errno.h>