fprintflinux
1. linux socket編程 雙線程同時讀寫緩沖流時為什麼fprintf被阻塞了
你用fprintf讀寫socket?如果是,那麼應該改成send或者write因為fprintf第一個參數為FILE *而文件描述符的是int類型上就有問題。如果不是,那麼會不會兩個線程同時讀取一個socket介面,而當時數據正好被另一個線程所讀取,而導致一個線程所阻塞。
2. 在Linux下用c語言編程
4。守護進程的創建
如果你在DOS時代編寫過程序,那麼你也許知道在DOS下為了編寫一個常駐內存的程序我們要編寫多少代碼了.相反如果在Linux下編寫一個"常駐內存"的程序卻是很容易的.我們只要幾行代碼就可以做到. 實際上由於Linux是多任務操作系統,我們就是不編寫代碼也可以把一個程序放到後台去執行的.我們只要在命令後面加上&符號SHELL就會把我們的程序放到後台去運行的. 這里我們"開發"一個後台檢查郵件的程序.這個程序每個一個指定的時間回去檢查我們的郵箱,如果發現我們有郵件了,會不斷的報警(通過機箱上的小喇叭來發出聲音). 後面有這個函數的加強版本加強版本
後台進程的創建思想: 首先父進程創建一個子進程.然後子進程殺死父進程(是不是很無情?). 信號處理所有的工作由子進程來處理.
#include
#include
#include
#include
#include
#include
#include
/* Linux 的默任個人的郵箱地址是 /var/spool/mail/用戶的登錄名 */
#define MAIL "/var/spool/mail/hoyt"
/* 睡眠10秒鍾 */
#define SLEEP_TIME 10
main(void)
{
pid_t child;
if((child=fork())==-1)
{
printf("Fork Error:%s\n",strerror(errno));
exit(1);
}
else if(child>0)
while(1);
if(kill(getppid(),SIGTERM)==-1)
{
printf("Kill Parent Error:%s\n",strerror(errno));
exit(1);
}
{
int mailfd;
while(1)
{
if((mailfd=open(MAIL,O_RDONLY))!=-1)
{
fprintf(stderr,"%s","\007");
close(mailfd);
}
sleep(SLEEP_TIME);
}
}
}
你可以在默認的路徑下創建你的郵箱文件,然後測試一下這個程序.當然這個程序還有很多地方要改善的.我們後面會對這個小程序改善的,再看我的改善之前你可以嘗試自己改善一下.比如讓用戶指定郵相的路徑和睡眠時間等等.相信自己可以做到的.動手吧,勇敢的探險者.
好了進程一節的內容我們就先學到這里了.進程是一個非常重要的概念,許多的程序都會用子進程.創建一個子進程是每一個程序員的基本要求!
3. linux 關於文件讀寫的問題
1. 文件write操作是原子的,多個進程同時寫文件,原理上是沒問題的。但是問題會出現在:如果多個進程寫文件時是先lseek再write,就會出現覆蓋。打開文件時使用append標志可以使先lseek再write這個操作變成原子操作,這樣可以避免覆蓋。
2. 多線程共享一個文件句柄的話,是不會有問題的。
3.
4.linux讀寫磁碟文件過程中,一般情況下並不是直接操作磁碟上的文件,而是讀寫內存中的磁碟高速緩存,內核選擇合適的時機把臟頁同步到磁碟。所以讀寫文件時不立刻調用io不是因為你說的緩沖區,read和write是沒有緩沖區的。
5. fprintf和printf一樣,是有緩沖區的,不過大小我不知道,也沒必要知道吧。
4. 在linux下,寫一個c語言程序把一個文件的內容寫入另一個文件中
#include<stdio.h>
main()
{
FILE*fi,*fo;
charc;
fi=fopen("input","r");
fo=fopen("output","w");
while(fscanf(fi,"%c",&c)!=EOF)
fprintf(fo,"%c",c);
fclose(fi);
fclose(fo);
}
5. 用linux c語言編寫 為一個文件裡面的內容的每一行添加一個指定的字元
1、基本思路:從第一個文本文件中用
fgets()
函數讀出一行數據,對讀出的每一鏈明搜行數據進行判斷,如果需要在它的適當位置插入一行,把相應的新內容、以及該行的內容寫到第二個文本文件中。如果槐猜不需要在該位置插入一行,那就直接將該行數據用
fprintf()
函數寫入第二個文本文件中。
2、偽代碼:
1.打開要修改的文件A,
2.創建一個臨時文件B,
3.
while(沒到達文件A末尾)
從A中讀取一行,寫到B中,然後寫入要追加的內容,寫入換行符
4.關閉文件A,關閉文件B,
5.刪除文件A(用remove函數),重命名棚歷B為A(用rename函數)
6. 求救!!如何在c語言中用fprintf函數輸出txt文件
fprintf 簡介 c/c++語言函數: fprintf 功 能 傳送格式化輸出到一個文件中 用 法 #include <stdio.h> int fprintf( FILE *stream, const char *format, ... ); fprintf()函數根據指定的format(格式)(格式)發送信息(參數)到由stream(流)指定的文件. fprintf()只能和printf()一樣工作. fprintf()的返回值是輸出的字元數,發生錯誤時返回一個負值. 返回值 成功時返回轉換的位元組數,失敗時返回一個負數. 在LINUX/UNIX操系統中成功返回0,失敗返回-1。並置errno值. 程序例 /* Program to create backup of the AUTOEXEC.BAT file */ #include <stdio.h> int main(void) { FILE *in, *out; if ((in = fopen("//AUTOEXEC.BAT", "rt")) == NULL) { fprintf(stderr, "Cannot open input file./n"); return 1; } if ((out = fopen("//AUTOEXEC.BAK", "wt")) == NULL) { fprintf(stderr, "Cannot open output file./n"); return 1; } while (!feof(in)) fputc(fgetc(in), out); fclose(in); fclose(out); return 0; } 舉例用法: #include <stdio.h> #include <process.h> FILE *stream; void main( void ) { int i = 10; double fp = 1.5; char s[] = "this is a string"; char c = '/n'; stream = fopen( "fprintf.out", "w" ); fprintf( stream, "%s%c", s, c ); fprintf( stream, "%d/n", i ); fprintf( stream, "%f/n", fp ); fclose( stream ); system( "type fprintf.out" ); } 屏幕輸出: this is a string 10 1.500000 格式化規定符 %d 十進制有符號整數 %u 十進制無符號整數 %f 浮點數 %s 字元串 %c 單個字元 %p 指針的值 %e 指數形式的浮點數 %x, %X 無符號以十六進製表示的整數 %0 無符號以八進製表示的整數 %g 自動選擇合適的表示法
7. Linux下C編程,實現每3秒輸出一次時間,並且保存在文件中,程序運行有錯誤
結構體的大小不能簡單認為就是成員的疊加..!!!
所以你fprintf(「%d」)並不是說數據存文本裡面就佔四個位元組,只是用10進制列印出來,可能是1個位元組,也可能是5個位元組,你fprintf("%s"),雖然長度在實際上就是24+1個位元組,但是結構體中組織數據是需要對齊的.. temp2[25]佔用內存是28個位元組,因為是32位機,數據一般會四個位元組對齊...對一個位元組也是這樣..自己看看sizeof(struct shijian)的大小....
fprintf("%4d")
fprintf("%28s")
用格式輸出保證這個10進制數字的字元串佔4個位元組,這個時間的字元串佔28個位元組
這樣就把文本的數據組織的和結構體一樣大了..
調試的時候看看到底讀出了多少個位元組...fread你可以把單元設置為1,這樣就能自己看讀出出多少個位元組,fread給你算了你當然看不到細節...
#include<stdio.h>
#include<time.h>
#include<string.h>
int main(int argc,char *argv[])
{
time_t timep1;
struct shijian
{
int number;
char timep2[25];
};
FILE *fp=NULL;
if ((fp=fopen("1.txt","a+"))==NULL)
{
printf("can not open !");
return -1;
}
struct shijian shijian[200];
int i=1;
int rc;
while(i==1 && rc < 10000)//rc超出10000的話,程序就又會不對勁了...只給了4個位
{
rc=fread(shijian,sizeof(struct shijian),200,fp);
// fflush(fp);
shijian->number=rc+1;
// shijian->number=i;
// i=rc;
time(&timep1);
strcpy(shijian->timep2,ctime(&timep1));
printf("%d %s\n",shijian->number,shijian->timep2);
// fwrite(q->number,sizeof(q->number),1,fp);
// fflush(fp);
fprintf(fp,"%4d",shijian->number);fflush(fp);
fprintf(fp,"%28s",shijian->timep2);fflush(fp);
// fwrite(shijian->timep2,sizeof(shijian->timep2),1,fp);
rewind(fp);
sleep(3);
// fseek(fp,0,SEEK_SET);
// (shijian->number)++;
}
fclose(fp);
return 0;
}