一、进程
(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; }