我試圖解決遺留代碼中的一些錯誤。這是代碼: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*)¶m,&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(我看到某個地方它是正確的值),然後我試圖以這種方式撥打fgets
:fgets(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,因爲我從來沒有使用過它。
任何幫助和提示將受到歡迎。
再次感謝!
難道是合理的(即沒有太多的代碼),以提供必要把這個在主附加_relevant_部分()函數並運行它? – ryyker
那裏有#include嗎? read()'怎麼辦?你能從'stdin'讀'()'嗎? –
2013-10-17 21:23:16
當您編輯您的問題時,例如要添加一些代碼,請確保使用__whitespaces__進行縮進。簡單地用適當的空白序列來替換你的標籤頁,這會讓我們更容易閱讀;)(PS:4 whitespaces = 1 indentation level) – Rerito