linux—C整理

全局变量:存储在固定的存 储 区   在函数定义之外

局部变量:存储在函数的栈 帧 上  


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();



waitwaitpid函数

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);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值