一、进程
(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;
}
posted on
浙公网安备 33010602011771号