`
lobin
  • 浏览: 426047 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Linux C 编程

阅读更多

 

写道

 

写道

 

写道

  

 

写道

 

写道

 

 

 

静态链接库

 

动态链接库 

 

C标准库

 

进程和线程

进程是系统进行资源分配和调度的基本单位。

进程其实也存在父子关系,也存在进程组,还有进程组leader。

 

在程序中我们也可以创建进程。

 

创建进程最简单的方式就是通过fork,通过这个系统调用可以简单的创建一个进程。需要注意的是,通过这种方式创建的进程是子进程。

 

另外一种创建进程的方式就是通过clone系统调用。

 

 

线程detach状态

如果线程已经处于detached状态,当线程终止时,线程资源将自动释放还给系统。这不同于joinable状态的线程,线程终止时需要通过调用pthread_join来释放线程资源。

 

如果线程已经处于detached状态,不能再将线程设置为joinable状态。

 

并且如果线程已经处于detached状态,如果再尝试detach,将导致不确定的行为,可能会导致程序中断退出。

 

pthread_attr_setdetachstate

函数原型

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

 

pthread_attr_getdetachstate

函数原型

int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);

 

设置线程detach状态为joinable状态

线程detach状态默认就是joinable状态,所以其实不用设置。

 

#include <stdio.h>
#include <pthread.h>

void* start_routine(void *arg)
{
  char *name = (char *) (arg);

  printf("thread %s called.\n", name);
  return NULL;
}

int main()
{
  pthread_t pthread;
  pthread_attr_t attr;

  if (pthread_attr_init(&attr))
  {
    return -1;
  }
  if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE))
  {
    return -1;
  }

  pthread_create(&pthread, &attr, start_routine, "#1");

  pthread_attr_destroy(&attr);
  return 0;
}

设置线程detach状态为detached状态

 

#include <stdio.h>
#include <pthread.h>

void* start_routine(void *arg)
{
  char *name = (char *) (arg);

  printf("thread %s called.\n", name);
  return NULL;
}

int main()
{
  pthread_t pthread;
  pthread_attr_t attr;

  if (pthread_attr_init(&attr))
  {
    return -1;
  }
  if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED))
  {
    return -1;
  }

  pthread_create(&pthread, &attr, start_routine, "#1");

  pthread_attr_destroy(&attr);
  return 0;
}

 

 

线程调度策略

pthread_attr_getschedpolicy

函数原型

int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);

 

pthread_attr_setschedpolicy

函数原型

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

 

线程资源竞争范围

pthread_attr_getscope

函数原型

int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);

 

pthread_attr_setscope

函数原型

int pthread_attr_setscope(pthread_attr_t *attr, int scope);

 

detach线程

在创建线程的时候也可以通过线程属性来指定线程的detach状态为detached状态。

 

pthread_detach

函数原型

int pthread_detach(pthread_t thread);

 

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void* start_routine(void *arg)
{
  char *name = (char *) (arg);

  pthread_t pthread = pthread_self();
  pthread_attr_t attr;

  int detachstate;

  printf("thread %s called.\n", name);

  sleep(60);
  if (pthread_getattr_np(pthread, &attr))
  {
    return NULL;
  }

  if (pthread_attr_getdetachstate(&attr, &detachstate))
  {
    return NULL;
  }
  printf("detach state: %d, %d=joinable,%d=detached\n", detachstate, PTHREAD_CREATE_JOINABLE, PTHREAD_CREATE_DETACHED);

  return NULL;
}

int main()
{
  pthread_t pthread;
  pthread_attr_t attr;

  if (pthread_attr_init(&attr))
  {
    return -1;
  }
  
  pthread_create(&pthread, &attr, start_routine, "#1");

  if (pthread_detach(pthread))
  {
    printf("pthread_detach err\n");
    return -1;
  }

  pthread_attr_destroy(&attr);

  while(1)
  {
    
  }
  return 0;
}

 

 

线程挂起

 

pthread_join

函数原型

int pthread_join(pthread_t thread, void **retval);

 

线程取消

pthread_cancel

函数原型

int pthread_cancel(pthread_t thread);

 

线程取消清理函数

pthread_cleanup_push

函数原型

void pthread_cleanup_push(void (*routine)(void *), void *arg);

 

线程取消清理函数例程

函数原型

void routine(void *)

 

pthread_cleanup_pop

函数原型

void pthread_cleanup_pop(int execute);

 

杀死线程

pthread_kill

函数原型

int pthread_kill(pthread_t thread, int sig);

 

 

 

线程调度相关函数

 

sched_yield

让出CPU

 

函数原型

int sched_yield(void); 

 

pthread_yield

让出CPU

 

函数原型

int pthread_yield(void);

写道
This call is nonstandard, but present on several other systems. Use the standardized sched_yield(2) instead.

 

IO

 

Socket IO

Socket IO也包括阻塞式和非阻塞式Socket IO。

 

阻塞式和非阻塞式Socket IO和阻塞式和非阻塞式Socket

 

BIO

BIO即阻塞式IO

 

NIO

NIO即非阻塞式IO

Socket NIO需要将socket设置为非阻塞式socket。

 

AIO

AIO即异步IO

 

 

poll

 

syslog

openlog

函数原型

void openlog(const char *ident, int option, int facility);

 

syslog

函数原型

void syslog(int priority, const char *format, ...);

 

closelog

函数原型

void closelog(void);

 

closelog可以不调用

写道
The use of closelog() is optional.

 

#include<stdio.h>
#include<stdlib.h>
#include<syslog.h>

int main(int argc, char **argv)
{
  int i;
  if (argc == 1)
  {
    return 0;
  }

  openlog(argv[0], LOG_PID | LOG_NOWAIT | LOG_NDELAY, LOG_USER);

  for (i = 1; i < argc; i++)
  {
    syslog(LOG_INFO, "%s", argv[i]);
  }
  closelog(); // The use of closelog() is optional.
}

编译链接

# gcc syslog_test.c -o syslog_test

 

另启动一个终端

# tail -f /var/log/messages

Sep 24 09:32:04 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1294" x-info="http://www.rsyslog.com"] rsyslogd was HUPed

Sep 24 12:05:56 localhost sz[5166]: [root] glibc-2.12.1-tree.txt/ZMODEM: 119409 Bytes, 28858 BPS

Sep 24 12:13:34 localhost rz[5184]: [root] pthread_create_test.c/ZMODEM: 515 Bytes, 11992 BPS

Sep 24 12:15:28 localhost rz[5278]: [root] pthread_create_test4.c/ZMODEM: 604 Bytes, 19630 BPS

Sep 24 12:51:09 localhost rz[5372]: [root] syslog_test.c/ZMODEM: 391 Bytes, 11308 BPS

 

在原来的终端上运行

# ./syslog_test

# ./syslog_test running...

# ./syslog_test a b c 1 2 3

 

# tail -f /var/log/messages

Sep 24 09:32:04 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1294" x-info="http://www.rsyslog.com"] rsyslogd was HUPed

Sep 24 12:05:56 localhost sz[5166]: [root] glibc-2.12.1-tree.txt/ZMODEM: 119409 Bytes, 28858 BPS

Sep 24 12:13:34 localhost rz[5184]: [root] pthread_create_test.c/ZMODEM: 515 Bytes, 11992 BPS

Sep 24 12:15:28 localhost rz[5278]: [root] pthread_create_test4.c/ZMODEM: 604 Bytes, 19630 BPS

Sep 24 12:51:09 localhost rz[5372]: [root] syslog_test.c/ZMODEM: 391 Bytes, 11308 BPS

 

 

 

 

 

 

 

 

 

Sep 24 12:52:07 localhost ./syslog_test[5385]: running...

Sep 24 12:59:22 localhost ./syslog_test[5386]: a

Sep 24 12:59:22 localhost ./syslog_test[5386]: b

Sep 24 12:59:22 localhost ./syslog_test[5386]: c

Sep 24 12:59:22 localhost ./syslog_test[5386]: 1

Sep 24 12:59:22 localhost ./syslog_test[5386]: 2

Sep 24 12:59:22 localhost ./syslog_test[5386]: 3

 

Allegro

TRACE

void TRACE(char *msg, ...);

 

al_trace

函数原型

void al_trace(const char *msg, ...);

 

POSIX Tracing

 

分享到:
评论

相关推荐

    Linux C编程从初学到精通

    Linux C编程从初学到精通,是许多程序员学习Linux C的起点,它通过实例讲解和理论结合的方式,帮助读者理解Linux环境下C语言编程的各个方面。 首先,初学者需要了解Linux操作系统的基础知识,包括Linux的文件系统...

    LinuxC编程实战电子书

     《LinuxC编程实战》内容翔实,主要包括:Linux系统下C语言及其编程环境的介绍,系统编程的所 有主题——文件和目录、进程、线程、信号、进程间通信、网络编程和图形界面编程、出错处理、库的 创建与使用、编写...

    Linux C语言编程实战 书附源代码

    《Linux C语言编程实战》这本书旨在帮助读者深入理解这两种技术,并通过实践来提升技能。源代码是学习过程中不可或缺的一部分,因为它使读者能够直接查看和运行程序,从而加深对概念的理解。 首先,我们要了解Linux...

    宋劲杉-Linux C编程一站式学习

    《宋劲杉-Linux C编程一站式学习》这本书深入浅出地介绍了Linux环境下的C语言编程技术,涵盖了从基础语法到高级特性的全方位知识。作者宋劲杉,毕业于清华大学,以其深厚的学术背景和实践经验,为读者提供了宝贵的...

    精通LinuxC编程源代码

    在“精通Linux C编程源代码”这个主题中,我们探讨的是如何在Linux操作系统环境下使用C语言进行高效且灵活的程序开发。C语言是系统级编程的基石,而在Linux这一开源操作系统上,C语言更是得到了广泛的应用,从内核...

    linuxc编程、linuxc编程

    嵌入式 linux c 编程、入门超好的教材

    精通linux C编程 源码 光盘资料

    《精通Linux C编程》是一本深入探讨Linux环境下C语言编程技术的专业书籍,旨在帮助读者从基础知识到高级技巧全面掌握Linux下的C编程。源码和光盘资料提供了丰富的实践素材,以便学习者能够理论结合实际,加深对编程...

    linux c编程实战附带光盘

    《Linux C编程实战》是董永清先生撰写的一本深入探讨Linux环境下C语言编程的书籍。这本书籍旨在帮助读者掌握在Linux系统上进行C语言编程的基础知识和高级技巧,为软件开发人员提供实用的指导。光盘附带的资料包含了...

    linux C编程实战光盘

    Linux C编程实战光盘的内容涵盖了Linux操作系统环境下的C语言编程技术,这是一本结合理论与实践的书籍。在Linux系统中,C语言是基础且强大的编程工具,它提供了低级别的系统访问权限,使得开发者能够创建高效、可靠...

    linux C编程实战

    第一篇 Linux和C编程基础  第1章 Linux系统概述  1.1 Linux操作系统介绍   1.1.1 Linux的发展历程   1.1.2 Linux的特性   1.1.3 Linux的内核版本和发行版本   1.2 C语言简介   1.2.1 C语言的...

    LINUX C编程从初学到精通 张繁

    深入浅出、循序渐进地讲解了Linux平台下的C程序设计,并通过大量的程序实例,以及综合开发案例的演示,帮助读者快速掌握Linux下C语言编程的方法和技巧。《Linux C编程从初学到精通》内容翔实,共分为三大部分。第一...

    《Linux C编程从初学到精通》源码和实战演练参考答案

    1. **基本的C语言编程**:讲解C语言的基本语法,如变量声明、常量、数据类型、运算符、流程控制语句(if、switch、for、while)、函数定义与调用等。 2. **内存管理与指针**:深入讲解指针的概念,如何使用指针操作...

    linux c 编程实战随书光盘

    在《Linux C编程实战》这本书的随书光盘中,我们能够找到一系列关于Linux系统下C语言编程的实践性资源。这些资源对于学习者来说是极其宝贵的,它们可以帮助读者深入理解C语言在Linux环境下的应用,提升编程技能,...

    Linux C编程实战 光盘

    接着,"Linux下C编程_源代码"这部分则包含了一系列C语言编程的实例。这些源代码涵盖了基本输入输出、文件操作、进程通信、线程管理、系统调用等主题。通过阅读和运行这些代码,开发者可以深入理解C语言在Linux系统中...

    linux c编程资料大全

    这份"Linux C编程资料大全"涵盖了从基础到高级的全方面知识,旨在帮助开发者深入理解和掌握C语言在Linux环境下的运用。 首先,Linux是开源的操作系统,其内核由C语言编写,因此,Linux C编程涉及对操作系统内核接口...

    linux C编程实战_linux编程_

    在深入探讨“Linux C编程实战”这一主题时,我们首先要理解Linux操作系统的基础和C语言的编程原理。Linux是一个开源的、类Unix的操作系统,而C语言则是一种强大的、低级的编程语言,常用于系统级编程,如操作系统、...

    Linux C编程一站式学习

    首先,Linux是开源的操作系统,其内核由C语言编写,因此,对于想要深入理解系统底层运作的人来说,学习Linux C编程是必不可少的。C语言的简洁、高效和灵活性使得它成为编写系统级软件的理想选择。 Linux环境下的C...

Global site tag (gtag.js) - Google Analytics