如何查找Linux中一些特殊数据类型定义,比如pid_t和uid_t

如何查找Linux中一些特殊数据类型定义,比如pid_t和uid_t,第1张

在sys/types.h头文件中搜索pid_t,可以找到下面的语句: #ifndef __pid_t_defined typedef __pid_t pid_t# define __pid_t_defined #endif 可以看到pid_t类型其实就是__pid_t类型,但是在sys/types.h在头文件中没有找到__pid_t这个类型,这个时候应该怎么办呢?看sys/types.h中包含的头文件,即include语句,从这些语句中选择bits/types.h这个头文件,至于为什么这就牵涉到内核的一些类型定义的规则或者叫规律,但是一般按照先sys目录然后再bits目录都没有错。在bits/types.h头文件中可以找到下面的语句: __STD_TYPE __PID_T_TYPE __pid_t也就是说__pid_t其实是__PID_T_TYPE类型,而这个类型在哪定义呢?也是先看include语句,选择bits/typesizes.h头文件,也是经验,从这个头文件中就可以找到下面的语句: #define __PID_T_TYPE __S32_TYPE 也就是说__PID_T_TYPE其实是__S32_TYPE类型,如果单从字面意思看的话这应该是一个32位的整形或者其他类型,但是千万不要这么早下结论。而这个类型在bits/typesize.h中找不到,而且这个头文件中也没有include语句,这个时候怎么办呢?还去bits/types.h中找,可以找到下面的语句: #define __S32_TYPE int 至此,终于找到了,pid_t其实就是int类型。在32位机下pid_t是32位的整数,在64位机下pid_t是64位整数,所以看到__S32_TYPE这样的类型千万不要过早地下结论是32位或64位。总结一下,找一个类型,一般的过程就是(比如从xxx.h开始): xxx.h----->sys/xxx.h----->bits/xxx.h----->bits/types.h和bits/typesize.h 或者有时还要去asm目录和asm-generic目录中的头文件中找。还有一种方式就是在linux内核源码中找,但是可能某些同学感觉不爽,哈哈!

姓名:冯成 学号:19020100164 学院:丁香二号书院

转自:https://feixiaoxing.blog.csdn.net/article/details/7229483

【嵌牛导读】本文将介绍linux下的C语言开发中的管道通信

【嵌牛鼻子】linux C语言 管道通信

【嵌牛提问】linux下的C语言开发中的管道通信是什么?

Linux系统本身为进程间通信提供了很多的方式,比如说管道、共享内存、socket通信等。管道的使用十分简单,在创建了匿名管道之后,我们只需要从一个管道发送数据,再从另外一个管道接受数据即可。

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

int pipe_default[2] 

int main()

{

    pid_t pid

    char buffer[32]

    memset(buffer, 0, 32)

    if(pipe(pipe_default) <0)

    {

        printf("Failed to create pipe!\n")

        return 0

    }

    if(0 == (pid = fork()))

    {

        close(pipe_default[1])

        sleep(5)

        if(read(pipe_default[0], buffer, 32) >0)

        {

            printf("Receive data from server, %s!\n", buffer)

        }

        close(pipe_default[0])

    }

    else

    {

        close(pipe_default[0])

        if(-1 != write(pipe_default[1], "hello", strlen("hello")))

        {

            printf("Send data to client, hello!\n")

        }

        close(pipe_default[1])

        waitpid(pid, NULL, 0)

    }

    return 1

}

    下面我们就可以开始编译运行了,老规矩分成两步骤进行:(1)输入gcc pipe.c -o pipe;(2)然后输入./pipe,过一会儿你就可以看到下面的打印了。

[test@localhost pipe]$ ./pipe

Send data to client, hello!

Receive data from server, hello!

守护进程daemon,是生存期较长的一种进程。它们常常在系统自举时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX系统有很多守护进程,它们执行日常事务活动。

1、系统自举

自举(bootstrapping)一词来自于人都是靠自身的自举机构站立起来的这一思想。计算机必须具备自举能力将自己所有的元件激活,以便能完成加载 *** 作系统这一目的,然后再由 *** 作系统承担起那些单靠自举代码无法完成的更复杂的任务。

自举只有两个功能:加电自检和磁盘引导。

加电自检:当我们按下计算机电源开关时,头几秒钟机器似乎什么反应也没有,其实,这时的计算机正在进行加电自检,以断定它的所有元件都在正确地工作。如果某个元件有故障,显示器上就会出现报警提示信息(如果显示器也不能正常工作,则以一串嘟嘟声来报警)。由于大多数计算机工作非常可靠,加电自检报警非常罕见。

磁盘引导:查找装有 *** 作系统的磁盘驱动器。从磁盘加载 *** 作系统的原因有二,一是 *** 作系统升级简单容易,二是使用户拥有选择 *** 作系统的自由。

当加电自检和磁盘引导完成时,自举 *** 作就启动一个读写 *** 作系统文件和将它们复制到随机存储器中的过程,此时的机器才是真正意义上的计算机。计算机的启动可以有冷启动和热启动两种方式 ,它们之间的差别是热启动不进行机器的自检(机器本身配置的检查与测试),当计算机在使用过程中由于某些原因造成死机时,可以对计算机进行热启动处理。

2、守护进程的概念

通过ps axj命令可以查看到守护进程:

参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。

代码如下:PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 1 1 1 ? -1 Ss 0 0:01 /sbin/init 0 2 0 0 ? -1 S<0 0:00 [kthreadd] 2 3 0 0 ? -1 S<0 0:00 [migration/0] 2 4 0 0 ? -1 S<0 0:00 [ksoftirqd/0]... 1 2373 2373 2373 ? -1 S<s 0 0:00 /sbin/udevd --daemon... 1 4680 4680 4680 ? -1 Ss 0 0:00 /usr/sbin/acpid -c /etc... 1 4808 4808 4808 ? -1 Ss 102 0:00 /sbin/syslogd -u syslog...

凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程。在COMMAND一列用[]括起来的名字表示内核线程,这些线程在内核里创建,没有用户空间代码,因此没有程序文件名和命令行,通常采用以k开头的名字,表示Kernel。init进程我们已经很熟悉了,udevd负责维护/dev目录下的设备文件,acpid负责电源管理,syslogd负责维护/var/log下的日志文件,可以看出,守护进程通常采用以d结尾的`名字,表示Daemon。 创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。 例子: C/C++ Code复制内容到剪贴板 void daemonize(void) { pid_t pidprintf("into deamonizen")if (pid=fork() <0) { perror("fork")exit(1)} else if (pid !=0) { exit(0)} setsid()if (chdir("/") <0) { perror("chdir")exit(1)} close(0)open("/dev/null", O_RDWR)dup2(0, 1)dup2(0, 2)printf("out deamonizen")}

3、编写守护进程 在编写守护进程程序时,需遵循一些基本规则:

(1)首先要做的是调用umask将文件模式创建屏蔽字设置为0。

(2)调用fork,然后使父进程退出。

(3)调用setsid以创建一个新会话。

(4)将当前工作目录更改为根目录。

(5)关闭不再需要的文件描述符。

(6)某些守护进程打开/dev/null使其具有文件描述符0、1和2,任何一个试图读标准输入、写标准输出或标准出错的库例程都不会产生任何效果。 与守护进程有关的一个问题是如何处理出错消息,需要有一个集中的守护进程出错记录设施,这就是syslogd进程。

4、守护进程惯例 为了正常运作,某些守护进程实现为单实例的,有就是在任一时刻只运行该守护进程的一个副本。文件锁和记录锁机制是一种方法的基础,该方法用来保证一个守护进程只有一个副本在运行。

在UNIX系统中,守护进程遵循下列公共惯例:

(1)若守护进程使用锁文件,那么该文件通常存放在/var/run目录中。锁文件的名字通常是name.pid,name是该守护进程或服务的名字。

(2)若守护进程支持配置选项,那么配置文件通常存放在/etc目录中。配置文件的名字通常是name.conf。

(3)守护进程可用命令行启动,但通常它们是由系统初始化脚本启动的。

(4)若一守护进程有一配置文件,那么当该守护进程启动时,它读该文件,但在此之后一般就不会再查看它。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7914129.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存