Linux系统编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统编程相关的知识,希望对你有一定的参考价值。

一 exec函数

e:env
int execle(const char *path, const char *arg,..., char * const envp[]);

环境变量指针数组:
char *envp[] = {"环境变量名=内容",NULL};

二 多线程

1.线程是进程中最小执行单元,多线程共享同一个进程的地址空间
2.Linux 内核调度的对象是线程,所以一个进程中多个线程参与操作操作系统统一调度

使用线程优点:
<1>效率高
<2>线程之间通信比较简单(全局变量)

使用线程缺点:
安全性差

三 线程API

1.线程创建
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
        void *(*start_routine) (void *), void *arg);

参数:
@thread 获取线程ID
@attr   设置线程属性  NULL:默认属性
@start_routine 线程执行的函数
@arg  给线程执行函数传递的参数

返回值:
成功返回0, 失败返回错误码

练习:
创建两个子线程,子1线程输出data值,子2线程data ++操作,主线程将data -- 操作 (data 在主线程定义)

2.线程退出

(1)线程函数返回 (return)
(2)pthread_exit
(3)pthread_cancel
(4)进程结束,这个进程中所有的线程都退出

void pthread_exit(void *retval);
功能:用来退出一个线程
参数:
@retval  返回一个地址值


int pthread_join(pthread_t thread, void **retval);
功能:等待一个线程退出,将退出线程未释放的资源释放掉
参数:
@thread  需要等待退出线程的ID
@retval  获得线程退出返回的值


void *thread_function(void *arg)
{
    int data = 100;

    pthread_exit(&data);
}

int main()
{
    int *p;

    pthread_join(tid,&p);
    return 0;
}

3.将线程标记分离

分离状态的线程在结束的时候,系统自动回收它的资源

int pthread_detach(pthread_t thread);
@thread  线程ID


三 线程互斥锁

功能:对共享资源实现互斥访问,保证访问的完整性

如果使用互斥锁,每个线程在访问共享资源,都必须先获得互斥锁,然后在访问共享资源,如果无法获得互斥锁
,则表示有其他线程正在访问共享资源,此时没有获得锁的线程会阻塞,直到其他线程释放锁,能再次获得锁

1.定义互斥锁[全局,让每个线程都可以访问到]
pthread_mutex_t lock;

2.初始化互斥锁

//[线程创建之前]动态初始化,属性使用默认 NULL
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

//静态初始化定义初始化
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

3.获得互斥锁
int pthread_mutex_lock(pthread_mutex_t *mutex);//操作共享资源之前加锁
int pthread_mutex_trylock(pthread_mutex_t *mutex);

4.释放锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);//操作共享资源结束的时候

5.销毁锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);//不需要再次使用锁的时候


以上是关于Linux系统编程的主要内容,如果未能解决你的问题,请参考以下文章

linux系统 C语言编程

Linux系统下C语言的编程技巧

嵌入式Linux从入门到精通之第九节:系统编程

嵌入式Linux从入门到精通之第九节:系统编程

Linux系统编程

(46)LINUX应用编程和网络编程之一Linux应用编程框架