2014-10-07 60 views
0

我在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); 

} 
+0

在'dd'或'fprintf(stderr,「dd」);'後面加一個換行符''\ n''代替。 – timrau 2014-10-07 15:27:37

+0

第二個例子產生輸出可能僅僅是因爲程序退出時程序壽命短並且輸出緩衝區被刷新。否則,它會有相同的行爲(嘗試在最後一次「close」之後添加一個'sleep(30)'語句來查看)。 – isedev 2014-10-07 15:37:21

+1

您可能希望通過選擇一個有效的入口點來構建不會顯示未定義行爲的程序。 'void main()'不是其中之一。 – nvoigt 2014-10-07 15:38:54

回答

5

printf從輸出將被緩衝。

立即獲得輸出,你有兩個選擇:

  • 添加一個換行符(\n)字符串(printf("dd\n");)結束。這隱式地刷新輸出流(即寫出緩衝的內容)。

  • 在printf語句(fflush(stdout);)之後顯式刷新標準輸出流。

至於問題的第二部分,所述第二示例產生輸出可能只是因爲程序是短暫的和輸出緩衝器被刷新程序退出時。否則,它將具有相同的行爲(嘗試在最後一次關閉後添加一條sleep(30)自行查看)。

+0

感謝您的回覆。你能解釋一下第一條代碼和我在第一條消息中發佈的第二條代碼之間的區別嗎?爲什麼在第二個沒有任何問題? – testermaster 2014-10-07 15:35:27

+0

查看該問題的評論。 – isedev 2014-10-07 15:38:13

+0

@LightnessRacesinOrbit完成。 – isedev 2014-10-07 16:49:12

3

你需要刷新你的輸出。

最簡單的方法:

printf("dd\n"); 

更好的辦法:

printf("dd"); 
fflush(stdout); 
+0

爲什麼你會說使用'fflush'更好?對我來說,如果你想在你的輸出中換行,換行方式會很好。 – 2014-10-07 15:35:47

+0

@FredLarson:據我所知,在你的輸出中放置'\ n'並不是_guaranteed_來刷新輸出,但通常會刷新它。 如果你想_guaranteed_行爲,使用'fflush'。如果你想要可能會發揮作用的東西,請使用'\ n'。 – abelenky 2014-10-07 15:46:09

+0

我明白了。謝謝。我在這裏找到更多信息:http://stackoverflow.com/q/5229096/10077 – 2014-10-07 15:50:19

2

您需要刷新輸出流。使用fflush(stdout)