我在Ubuntu上用C創建了一個服務器,但是我有一個printf函數不起作用的問題。這是代碼。我希望終端在程序啓動後立即打印「dd」,但它什麼都不做。建議?Printf在C程序中有不尋常的行爲
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
void main(){
printf("dd");
int ds_sock;
struct sockaddr_in my_addr;
ds_sock=socket(AF_INET,SOCK_STREAM,0);
memset(&my_addr,0,sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(25000);
my_addr.sin_addr.s_addr=INADDR_ANY;
bind(ds_sock,(struct sockaddr *)&my_addr,sizeof(my_addr));
listen(ds_sock,3);
printf("dd");
int ds_sock_acc;
struct sockaddr_in addr;
size_t sin_size = sizeof(struct sockaddr_in);
ds_sock_acc = accept(ds_sock,(struct sockaddr *)&addr,&sin_size);
while(ds_sock_acc==-1) {
printf("connessione non riuscita");
ds_sock_acc = accept(ds_sock,(struct sockaddr *)&addr,&sin_size);
}
printf("connessione riuscita");
close(ds_sock);
close(ds_sock_acc);
}
這(客戶端)按預期工作:
void main(){
printf("dd");
int ds_sock;
ds_sock = socket(AF_INET, SOCK_STREAM,0);
int ret;
struct sockaddr_in Eaddr;
Eaddr.sin_family = AF_INET;
Eaddr.sin_port = htons(25000);
Eaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
ret = connect(ds_sock,(struct sockaddr *)&Eaddr,sizeof(Eaddr));
while(ret==-1){
printf("Errore nel connect");
ret = connect(ds_sock,(struct sockaddr *)&Eaddr,sizeof(Eaddr));
}
printf("connect OK");
close(ds_sock);
}
在'dd'或'fprintf(stderr,「dd」);'後面加一個換行符''\ n''代替。 – timrau 2014-10-07 15:27:37
第二個例子產生輸出可能僅僅是因爲程序退出時程序壽命短並且輸出緩衝區被刷新。否則,它會有相同的行爲(嘗試在最後一次「close」之後添加一個'sleep(30)'語句來查看)。 – isedev 2014-10-07 15:37:21
您可能希望通過選擇一個有效的入口點來構建不會顯示未定義行爲的程序。 'void main()'不是其中之一。 – nvoigt 2014-10-07 15:38:54