導航:首頁 > 編程系統 > linuxc創建子線程

linuxc創建子線程

發布時間:2023-08-04 17:59:25

1. linux中C語言關於進程的創建

/*請解釋一下*/
while(((child=wait(&status))==-1)&(errno==EINTR));

這種的目的是父親進程等待子進程結束,回並回收子進程的資源,將子進程的退出狀態存答儲在status中,同時,返回該子進程的pid。
如果wait函數返回-1表示wait函數被其它情況打斷返回,並沒有等待到子進程結束,而同時判斷errno的值是不是EINTR(意思是讓你try again),那麼,讓進程繼續等待。因為這個錯誤並不是真正wait錯誤,而是被timeout時間等造成的,因此重新等待。而如果是其它情況,顯然是wait函數調用錯誤,即下面的if(child==-1),需要列印錯誤信息。『

//但你這句應該寫錯了。應該是邏輯與而不是位與操作。即
while(((child=wait(&status))==-1)&&(errno==EINTR));
/*請解釋一下*/
if(child==-1)

你對信號處理部分還需要努力。
另外介紹一本書《Linux高級程序設計 第3版》 上面講得很清楚。
有問題我們繼續交流,一起學習。

更多技術文章可以關注我的微博,名字:成都睿爾科技 。

2. linux 驅動中,如何建立一個普通線程

gcc xxx.c -lpthread 其中的-l是指抄包含的lib庫,具體寫法可以man gcc看下 多線程函數除了要包含頭文件pthread.h外還必須要包含lib庫pthread pthread_create是創建線程,但具體的線程裡面做什麼事是在void *create(void *arg)里,這個函數名是自...

3. linux c 編程:創建一個線程,監視某個目錄,一旦目錄里出現新的文件,就將文件轉移到指定的目錄里去。

/*
頭文件
*/
#define SRCPATH "srcpath/"
#define DSTPATH "dstpath/"

int movefile()
{
DIR *dir;
struct dirent *dt;
FILE *fp1,*fp2;
char filename1[256],filename2[256];
char buf[1024];
int readsize,writesize;

if((dir = opendir(SRCPATH)) == NULL)
{
printf("opendir %s error\n",SRCPATH);
return -1;
}
memset(filename1,0,sizeof(filename1));
strcpy(filename1,SRCPATH);
memset(filename2,0,sizeof(filename2));
strcpy(filename2,DSTPATH);
while(1)
{
while((dt = readdir(dir)) != NULL)
{
if(strcmp(dt->d_name,".")==0||strcmp(dt->d_name,"..")==0)
{
continue;
}
//如果這個目錄里 還有目錄,可以在這加判斷
//這里假設初始為空目錄
strcat(filename1,dt->d_name);
strcat(filename2,dt->d_name);
//如果進程資源較少可以直接用linux系統命令

fp1 = fopen(filename1,"rb");
if(fp1==NULL)
{
printf("open %s failed /n",filename1);
return -1;
}

fp2 = fopen(filename2,"wb");
if(fp2==NULL)
{
printf("open %s failed /n",filename2);
fclose(fp1);
return -1;
}

while((readsize = fread(buf,sizeof(buf),1,fp1))>0)
{
//total += readsize;
memset(buf,0,sizeof(buf));
writesize = fwrite(buf,sizeof(buf),1,fp2);
if(writesize!==readsize)
{
printf("write error");
return -2;
fclose(fp1);
fclose(fp2);
}
}
fclose(fp1);
fclose(fp2);
rmdir(filename2);
}
}
}

int main(int argc,char **argv)
{
pthread_t id1;
int ret;
ret = pthread_create(&id1, NULL, (void*)movefile, NULL);
return ret;
}
自己調試下

4. linux 線程裡面創建線程嗎

1、windows里的進程/線程是繼承自OS/2的。在windows里,"進程"是指一個程序,而"線程"是一個"進程"里的一個執行"線索"。從核心上講,windows的多進程與Linux並無多大的區別,在windows里的線程才相當於Linux的進程,是一個實際正在執行的代碼。但是,windows里同一個進程里各個線程之間是共享數據段的。這才是與Linux的進程最大的不同。2、在windows下,使用CreateThread函數創建線程,與Linux下創建進程同,windows線程不是從創建處開始運行的,而是由CreateThread指定一個函數,線程就從那個函數處開始運行。此程序同前面的UNIX程序一樣,由兩個線程各列印1000條信息。threadID是子線程的線程號,另外,全局變數g是子線程與父線程共享的,這就是與Linux最大的不同之處。大家可以看出,windows的進程/線程要比Linux復雜,在Linux要實現類似windows的線程並不難,只要fork以後,讓子進程調用ThreadProc函數,並且為全局變數開設共享數據區就行了,但在windows下就無法實現類似fork的功能了。所以現在windows下的C語言編譯器所提供的庫函數雖然已經能兼容大多數Linux/UNIX的庫函數,但卻仍無法實現fork。3、對於多任務系統,共享數據區是必要的,但也是一個容易引起混亂的問題,windows下,一個程序員很容易忘記線程之間的數據是共享的這一情況,一個線程修改過一個變數後,另一個線程卻又修改了它,結果引起程序出問題。但在Linux下,由於變數本來並不共享,而由程序員來顯式地指定要共享的數據,使程序變得更清晰與安全。

5. linux 編寫一個多線程程序,要求主線程創建3個子線程,3個子線程在執行時都修改一個他們的共享變數。

void func1(int n)
{
printf("%d",n*10);
}
void func1(int n)
{
printf("%d",n-10);
}

void func1(int n)
{
printf("%d",n/2);
}

int main(void)
{
int n = 10;
pthread_t 1_thread,2_thread,3_thread;
pthread_create(1_thread,NULL,func1,n);
pthread_create(2_thread,NULL,func2,n);
pthread_create(3_thread,NULL,func3,n);
return 0;
}

6. 在Linux下用C++創建新線程

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void* thread(void* arg)
{
printf ("The child process...\n");
}

int main(int argc, char *argv[])
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *)thread,NULL);
if(ret!=0)
{
printf ("Create pthread error!\n");
exit (1);
}

}
程序如上就可以編譯。
它屬於linux下C編程中多線程編程的范圍。
用命令
gcc -lpthread 1.c -o 1
./1
就可以出結果。
多線程編程的基礎可以參考
http://hi..com/huifeng00/blog/item/ed13ddc0d6c59c170ff47715.html

7. 怎麼用C語言實現兩個線程在Linux環境下列印

#include<stdio.h>
#include<pthread.h>

voidthread()
{
pthread_ttid=pthread_self();

while(1)
{
printf("pthread%u ",tid);
sleep(1);
}
}

intmain(intargc,char*argv[])
{
pthread_ttid=0;

if(0!=pthread_create(&tid,NULL,(void*)thread,NULL))
{
printf("createpthread%uerror ",tid);
return-1;
}

if(0!=pthread_create(&tid,NULL,(void*)thread,NULL))
{
printf("createpthread%uerror ",tid);
return-1;
}

while(1)
{
printf("main ");
sleep(1);
}

return0;
}

//編譯記得內加容-lpthread

閱讀全文

與linuxc創建子線程相關的資料

熱點內容
網站設計編程如何開始學習 瀏覽:749
淘寶代碼隱藏導航不見了 瀏覽:7
macbookpro如何修改文件內容 瀏覽:965
java穩定排序 瀏覽:53
oppo文件管理的圖片 瀏覽:335
plc編程步數怎麼計算 瀏覽:142
ipad看電腦文件 瀏覽:935
成都製作pdf文件 瀏覽:735
怎麼樣點開電腦裡面的網路連接 瀏覽:755
微信怎麼退出賬號 瀏覽:32
w微信開發者工具 瀏覽:325
資料庫還原附加 瀏覽:713
打包成exe執行文件 瀏覽:652
信豐營銷app有哪些 瀏覽:463
蘋果文件下載項如何下載 瀏覽:179
ps摳婚紗教程 瀏覽:203
如何在移動硬碟上隱藏文件夾 瀏覽:451
瑞虎8老車機怎麼刷app 瀏覽:992
學ui設計要學java嗎 瀏覽:275
淘寶票房數據源怎麼調整 瀏覽:470

友情鏈接