全局变量:存储在固定的存 储 区 在函数定义之外
局部变量:存储在函数的栈 帧 上
1、进程间通信:
管道:
1、pipe()的调用必须在fork()之前
2、及时关闭不需要的句柄
3、使用dup()之前确定定向的目标是最小的文件句柄
4、管道只能在父子进程间通信
example:
#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 80
int main(void)
{
int n;
int fd[2];
pid_t pid;
char line[MAXLINE];
if (pipe(fd) < 0) {
perror("pipe");
exit(1);
}
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
if (pid > 0) { /* parent */
close(fd[0]);
write(fd[1], "hello world\n", 12);
wait(NULL);
} else { /* child */
close(fd[1]);
n = read(fd[0], line, MAXLINE);
write(STDOUT_FILENO, line, n);
}
return 0;
}
有名管道(FIFO)
mknod();建立有名管道;mknod("/tmp/sampleFIFO",)
fclose(),fopen()打开有名管道;
消息队列:ipcs -q
创建消息队列:msgget()
对队列进行操作(删除):msgctl();
将消息写入队列:msgsnd();
从指定队列中读出消息:msgrcv();
共享内存:ipcs -m 查看当前系统IPC状态
创建共享内存:shmget(IPC_PRIVATE,4096,0666)
将一个存在的共享内存段连接到本进程空间:shmat();
共享内存操作:shmctl()
将指定的共享内存段从当前空间中脱离出去:shmdt();
wait和waitpid函数
pid_t wait(int *status);
waitpid:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0) {
perror("fork failed");
exit(1);
}
if (pid == 0) {
int i;
for (i = 3; i > 0; i--) {
printf("This is the child\n");
sleep(1);
}
exit(3);
} else {
int stat_val;
waitpid(pid, &stat_val, 0);
if (WIFEXITED(stat_val))
printf("Child exited with code%d\n", WEXITSTATUS(stat_val));
else if (WIFSIGNALED(stat_val))
printf("Child terminated abnormally, signal %d\n", WTERMSIG(stat_val));
}
return 0;
}
线程基本函数:
创建线程:pthread_create
主线程消亡,其他线程不会退出: pthread_exit((void *)2);
等待线程结束:pthread_join(tid,(void *)status);
取消另一个线程:pthread_cancel(pthread_t tid);
互斥锁用来保证一段时间内只有一个线程在执行一段代码。
二 pthread_mutex_lock 和pthread_mutex_unlock
pthread_mutex_lock声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一个线程释放此互斥锁。
互斥量初始化:pthread_mutex_init()
或者pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER(malloc动态内存分配则不能使用)
销毁互斥量:pthread_mutex_destroy(pthread_mutex_t *mutex)
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#define NLOOP 5000
int counter;
void * add(void *arg)
{
int i;
for(i=0;i<NLOOP;i++)
{
counter = val + 1;
printf("%x: %d\n", (unsigned int)pthread_self(),val + 1);
}
return NULL:
}
int main()
{
pthread_t tid_A,tid_B;
void* res;//指向线程的退出信息指针
printf("main thread ,id is %u\n",pthread_self());
if(pthread_create(&tid_A,NULL,&add,NULL)!=0)
{
printf("thread creation fail\n");
exit(1);
}
if(pthread_create(&tid_B,NULL,&add,NULL)!=0)
{
printf("thread creation fail\n");
exit(1);
}
//sleep(1);
//pthread_exit((void *)2);
pthread_join(tid_A,&res);
pthread_join(tid_B,NULL);
printf("hello world\n");
exit(0);
}