Process and Thread

一、进程

(1)定义

(2)进程状态

(3)进程与子进程

[示例代码]

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(){
	pid_t myPid;
	pid_t myParentPid;
	gid_t myGid;
	uid_t myUid;
            
	myPid = getpid();
	myParentPid = getppid();
	myGid = getgid();
	myUid = getuid();

	printf("my process id is  %d\n", myPid);
	printf("my parent is process id is %d\n", myParentPid);
	printf("my group id is %d\n", myGid);
	printf("my user id is %d\n", myUid);
	return 0;
}

(4)

  

(5)wait函数

[示例代码]

#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
int main(){
	pid_t ret;
	int status , i;
	int role = -1;
	ret = fork();
	if(ret > 0){
		printf("Parent: This the parent process (pid %d)\n", getpid());
		for(i=0;i<6;i++){
			printf("Parent: At count %d\n", i);
			sleep(1);      }
		ret = wait(&status);//防止僵尸进程的产生
		role=0;      }
	else
		if(ret ==0){
			printf("Child: This the child process (pid %d)\n", getpid());
			for(i=0;i<6;i++){
				printf("Chile: At count %d\n",i);
				sleep(1);       
			}
			role = 1;        
		}
		else{
			printf("Parent: Error trying to fork() (%d)\n", errno);
		}
		printf("%s: Exiting...\n", ((role ==0)?"Parent":"Child"));
		return 0;
}

(6)signal函数与exit函数

[示例代码]

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
void catch_ctlc( int sig_num){
	printf("Caught Control-C\n");
	fflush(stdout);//清除标准输出的缓存区
}
int main(){
	signal( SIGINT, catch_ctlc);
	printf("Go ahead,  make my day.\n");
	pause();
	return 0;
}

(7)kill函数与pause函数

[示例代码]

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
void usr1_handler( int sig_num){
	printf("Parent (%d) got the SIGUSR1\n", getpid() );
}
int main(){
	pid_t ret;
	int status;
	int role = -1;
	ret = fork();
	if( ret > 0){
		printf("Parent: This is the parent process (pid %d)\n",getpid() );
		signal( SIGUSR1, usr1_handler);
		role = 0;
		pause();
		printf("Parent: Awaiting child exit\n");
		ret = wait( &status);
	}         
} 
	else  
		if(ret == 0){
			printf("Child: This is the child process (pid %d)\n",  getpid());
			role = 1;
			sleep(1);
			printf("Child: Sending SIGUSR1 to pid %d\n", getppid());
			kill(getppid(), SIGUSR1);
			sleep(2);
		}else{
			printf("Parent: Error trying to fork() (%d)\n", errno);
		}
			printf("%s: Exiting…\n", ( ( role == 0) ? "Parent" : "Child"));
	return 0;
}

 二、线程

(1)定义

(2)进程与线程的区别

[示例代码]

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(){
	int ret;
	pthread_t mythread;
	ret = pthread_create( &mythread, NULL, myThread, NULL);
	if(ret != 0){
		printf(“Can not create pthread (%s)\n”, strerror(errno));
		exit(-1);        
	}
	return 0;
}
void *myThread(void *arg){
	printf(“Thread ran\n”);
	pthread_exit(arg);
}

(3)线程同步

#include <pthread.h>
#include <stdio.h>
void *myThread(void *arg){
	printf("Thread %d started\n", (int)arg);
	pthread_exit(arg);
}
#define MAX_THREADS 5
int main(){
	int ret, i, status;
	pthread_t threadIds[MAX_THREADS];
	for(i = 0; i<MAX_THREADS; i++){
		ret = pthread_create(&threadIds[i], NULL, myThread, (void*)i);
		if(ret != 0){
			printf("Error creating thread %d\n", (void*)i);
		}
	}
	for(i = 0; i<MAX_THREADS; i++){
		ret = pthread_join(threadIds[i], (void **)&status);
		if(ret != 0){
			printf("Error joining thread %d\n", (void *)i);
		}
		else{
			printf("Status = %d\n", status);
		}
	}
	return 0;
}

(4)线程互斥

             

[示例代码]

#include <pthread.h>
#include <stdio.h>
pthread_mutex_t cntr_mutex = PTHREAD_MUTEX_INITIALIZER;
long protVariable = 0L;
void *myThread(void *arg){
	int i, ret;
	for(i=0; i<10000; i++){
		ret = pthread_mutex_lock( &cntr_mutex );
		assert( ret == 0 );
		protVariable++;
		ret = pthread_mutex_unlock( &cntr_mutex );
		assert( ret == 0 );
	}
	pthread_exit(NULL);
}
#define MAX_THREADS 10
int main(){
	int ret, i;
	pthread_t threadIds[MAX_THREADS];
	for(i=0; i<MAX_THREADS; i++){
		ret = pthread_create( &threadIds[i], NULL, myThread, NULL);
		if(ret != 0){
			printf("Error creating thread %d\n", (int)threadIds[i]);
		}
	}
	for(i = 0; i<MAX_THREADS; i++){
		ret = pthread_join( threadIds[i], NULL);
		if(ret != 0){
			printf("Error joining thread %d\n", (int)threadIds[i]);
		}
	}
	printf("The protected variable value is %ld\n", protVariable);
	ret = pthread_mutex_destroy( & cntr_mutex );
	if(ret != 0 ){
		printf("Could not destroy the mutex\n");
	}
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/tanglulu/p/9022288.html