当前位置: 首页 > news >正文

我花钱买了一个函授本科seo搜索引擎优化网站

我花钱买了一个函授本科,seo搜索引擎优化网站,qq空间的网站,网站关键词没排名怎么办1. 多进程编程 1.1 fork #include sys/types.h #include unistd.h // 调用失败返回 -1 设置 errno pid_t fork( void );子进程返回 0#xff0c;父进程返回子进程 PID#xff1b; 信号位图被清除#xff08;父进程的信号处理函数不再对新进程起作用…1. 多进程编程 1.1 fork #include sys/types.h #include unistd.h // 调用失败返回 -1 设置 errno pid_t fork( void );子进程返回 0父进程返回子进程 PID 信号位图被清除父进程的信号处理函数不再对新进程起作用 1.2 exec 系列系统调用 替换当前进程映像一般情况下不会返回出错后返回 -1 并设置 errno 注意exec 函数不会关闭原程序打开的文件描述符除非该 fd 设置了 SOCK_CLOEXEC 属性 1.3 处理僵尸进程 #include sys/types.h #include sys/wait.h // 调用失败返回 -1 设置 errno pid_t wait( int* stat_loc ); pid_t waitpid( pid_t pid, int* stat_loc. int options );waitpid 只等待 pid 指定的子进程pid 取值为 -1和 wait 相同等待任意一个子进程结束 options 取值是 WNOHANG 时waitpid 是非阻塞的pid 指定的子进程没有结束或意外终止立即返回 0子进程正常退出返回子进程 PID 1.4 信号量 1.4.1 semget 创建一个新的信号量集或者获取一个已经存在的信号量集 #include sys/sem.h // 成功返回一个正整数标识信号量集 // 失败返回 -1 设置 errno int semget( key_t key, int num_sems. int sem_flags );key 用来标识一个全局唯一的信号量集传递特殊键值 IPC_PRIVATE值为 0可以保证总是创建新的信号量集 num_sems 指定信号量集中信号量的数目若是创建必须指定若是获取设为 0 sem_flags 指定该信号量的权限 后 9 位与open中的 mode 一致 #include sys/sem.h struct ipc_perm {key_t key; /* 键值 */uid_t uid; /* 所有者的有效用户 ID */gid_t gid; /* 所有者的有效组 ID */uid_t cuid; /* 创建者的有效用户 ID */gid_t cgid; /* 创建者的有效组 ID */mode_t mode; /* 访问权限 *//* 省略其他填充字段 */ };struct semid_ds {struct ipc_perm sem_perm; /* 信号量的操作权限 */unsigned long int sem_nsems; /* 信号量集的信号量数目 */time_t sem_otime; /* 最后一次调用 semop 的时间 */time_t sem_ctime; /* 最后一次调用 semctl 的时间 *//* 键值 */ }; semid_ds 是与信号量集相关联的内核数据结构semget作用是创建并初始化它会将 sem_otime 设为 0sem_ctime 设为当前系统时间 1.4.2 semop 改变信号量的值是原子操作 unsigned short semval; /* 信号量的值 */ unsigned short semzcnt; /* 等待信号值变为 0 的进程数量 */ unsigned short semncnt; /* 等待信号值增加的进程数量 */ pid_t sempid; /* 最后一次执行 semop 操作的进程 ID */ int semop( int sem_id, struct sembuf* sem_ops, size_t num_sem_ops );sem_id 是 semget返回的信号量集标识符sem_ops 指向 sembuf 数组 struct sembuf {unsigned short int sem_num;short int sem_op;short int sem_flg; }sem_num 为信号集中信号量的编号 SEM_UNDO 的含义是当进程退出时取消正在进行的 semop 操作会更新进程的 semadj 变量,来跟踪进程对信号量的修改情况 1.4.3 semctl 对信号量直接控制 int semctl( int sem_id, int sem_num, int command, ... );command 为要执行的命令有些命令需要第 4 个参数推荐如下形式 union semun {int val; /*用于 SETVAL 命令*/struct semid_ds* buf; /*用于 IPC_STAT 和 IPC_SET 命令*/unsigned short* array; /*用于 GETALL 和 SETALL 命令*/struct seminfo* __buf; /*用于 IPC_INFO 命令*/ };常用命令为 命令含义成功时返回值IPC_RMID移除信号量集唤醒所有等待该信号量集的进程semop返回错误errno 为 EIDRM0SETVAL将信号量的值设为 semun.val 同时内核数据中的 semid_ds.sem_ctime 被更新0 1.5 共享内存 最高效的 IPC 机制 1.5.1 shmget 创建一段新的共享内存或获取一段已经存在的共享内存 #include sys/shm.h // 成功返回正整数为共享内存的标识失败返回 -1 设置 errno int shmget( key_t key, size_t size, int shmflg );这三个参数与 semget含义相同size 指定共享内存的大小单位是字节 shmflg 支持额外的两个标志 SHM_HUGETLB系统使用“大页面”分配共享内存类似于 mmap的 MAP_HUGETLB 标志SHM_NORESERVE不为共享内存保留交换分区类似于 mmap的 MAP_NORESERVE 标志这样当物理内存不足时对该共享内存执行写操作将触发 SIGSEGV 信号 shmget创建共享内存所有字节都被初始化为 0与之关联的内核数据结构为 shmid_ds 被创建和初始化 struct shmid_ds {struct ipc_perm shm_perm; /* 共享内存的操作权限 */size_t shm_segsz; /* 共享内存的大小单位是字节 */__time_t shm_atime; /* 对这段内存最后一次调用 shmat 的时间 */__time_t shm_dtime; /* 对这段内存最后一次调用 shmdt 的时间 */__time_t shm_ctime; /* 对这段内存最后一次调用 shmctl 的时间 */__pid_t shm_cpid; /* 创建者的 PID */__pid_t shm_lpid; /* 最后一次执行 shmat 或 shmdt 操作的进程 PID */shmatt_t shm_nattach; /* 关联到此共享内存的进程数量 *//* 省略填充字段 */ };初始化时shm_lpid、shm_nattach、shm_atime、shm_dtime 设置为 0shm_ctime 设置为当前时间 1.5.2 shmat 和 shmdt 关联/分离到进程的地址空间 void* shmat( int shm_id, const void* shm_addr, int shmflg ); int shmdt( const void* shm_addr );shm_addr 指定将共享内存关联到进程的哪块空间地址 shm_addr 为 NULL由操作系统选择推荐的做法shm_addr 非空并且 SHM_RND 未设置共享内存关联到 addr 指定地址处shm_addr 非空并且设置了 SHM_RND 被关联的地址是 [shm_addr - (shm_addr%SHMLBA)] shmflg 还支持如下标志 SHM_RDONLY进程仅能读取共享内存中的内容SHM_REMAP如果地址 shm_addr 已经被关联到一段共享内存上重新关联SHM_EXEC指定对共享内存段的执行权限 shmat 成功返回被关联的地址失败返回(void *) -1 并设置 errno将 shm_nattachshm_lpid 设置为调用进程 PIDshm_atime 设置为当前时间 shmdt 成功时返回 0失败返回 -1 设置 errno将 shm_nattach–shm_lpid 设置为调用进程 PIDshm_dtime 设置为当前时间 1.5.3 shmctl // 失败时返回 -1 设置 errno int shmctl( int shm_id, int command, struct shmid_ds* buf );命令含义成功时返回值SETVAL将信号量的值设为 semun.val 同时内核数据中的 semid_ds.sem_ctime 被更新0 1.5.4 共享内存的 POSIX 方法 通过打开同一个文件 mmap 可以实现进程间的内存共享 Linux 提高了另一种利用 mmap 在无关进程间共享内存的方式无需任何文件的支持 #include sys/mman.h #include sys/stat.h #include fcntl.h // 创建或打开一个 POSIX 共享内存对象 int shm_open( const char* name, int oflag, mode_t mode ); int shm_unlink( const char* name );shm_open 成功返回一个文件描述符该 fd 可用于后续的 mmap 调用失败返回 -1 设置 errno。 shm_unlink 将 name 指定共享内存对象标记为等待删除当所有使用该共享对象的进程都使用 ummap将它从进程中分离后系统将销毁该对象 ftruncate(fd, length)会将参数 fd 指定的文件大小改为参数 length 指定的大小。 1.6 消息队列 两个进程间传递二进制块数据一种简单有效的方式 每个数据块都有一个特定的类型接收方可以根据类型来选择地接收数据 1.6.1 msgget 创建或获取消息队列 #include sys/msg.h int msgget( key_t key, int msgflg );参数含义与 semget一致与之关联的内核数据结构 msqid_ds 被创建并初始化 struct msqid_ds {struct ipc_perm msg_perm; /* 操作权限 */time_t msg_stime; /* 最后一次调用 msgsnd 的时间 */time_t msg_stime; /* 最后一次调用 msgrcv 的时间 */time_t msg_stime; /* 最后一次被修改的时间 */unsigned long __msg_cbytes; /* 消息队列中已有的字节数 */msgqnum_t msg_qnum; /* 消息队列中已有的消息数 */msglen_t msg_qbytes; /* 消息队列允许的最大字节数 */pid_t msg_lspid; /* 最后执行 msgsnd 的进程 PID */pid_t msg_lrpid; /* 最后执行 msgrcv 的进程 PID */ };1.6.2 msgsnd 把一条消息添加到消息队列中 // 成功返回 0失败返回 -1 int msgsnd( int msqid, const void* msg_ptr, size_t msg_sz, int msgflg );msg_ptr 指向一个准备发送的消息 struct msgbuf {long mtype; /* 消息类型必须为正整数 */char mtext[512]; /* 消息数据 */ };msg_sz 是消息数据部分的长度可以为 0 表示没有消息数据 msgflg 设置 IPC_NOWAIT 标志时表示非阻塞如果消息队列满默认情况下会阻塞如果设置了 IPC_NOWAIT 将立即返回并设置 errno 为 EAGAIN 处于阻塞状态的 msgsnd 可能被中断 消息队列被移除会立即返回errno 为 EIDRM程序接收到信号立即返回errno 为 EINTR 1.6.3 msgrcv 从消息队列中获取消息 // 成功返回 0失败返回 -1 int msgrcv( int msqid, void* msg_ptr, size_t msg_sz, long int msgtype, int msgflg );1msg_ptr 用于存储接收到的消息 2msgtype 指定接收何种类型的消息 为 0表示读取消息队列中的第一个消息大于 0读取第一个类型为 msgtype 的消息小于0读取第一个类型值比 msgtype 绝对值小的消息 3msgflg IPC_NOWAIT如果消息队列为空立即返回errno 设为 ENOMSGMSG_EXCEPTmsgtype 大于 0接收第一个非 msgtype 的消息MSG_NOERROR如果消息数据部分长度超过了 msg_sz将其截断 4阻塞的 msgrcv 被中断情况与 msgsnd 一致 1.6.4 msgctl // 失败返回 -1 int msgctl( int msqid, int command, struct msqid_ds* buf );1.7 IPC 命令 上述 3 种进程间通信方式都使用了全局唯一的键值来描述一个共享资源 Linux 下 ipcs 命令可以查看当前系统上的共享资源实例 1.8 进程间传递文件描述符 可以利用 UNIX 域 socket 在进程间传递特殊辅助数据 利用 sendmsg 和 recvmsg 可以发送附属数据 2. 多线程编程 内核线程运行在内核空间由内核调度 用户线程运行在用户空间由线程库调度 当进程的一个内核线程获得 CPU 使用权时加载并允许一个用户线程内核线程相当于用户线程运行的“容器” 一个进程可以拥有 M 个内核线程和 N 个用户线程M N它们之间的比值是固定的 1完全在用户空间实现 M:N 1:N 线程库利用 longjmp 来切换线程一个进程的所有执行线程共享该进程的时间片对外表现出相同的优先级 优点创建和调度线程的速度非常快不需要内核参与不占用额外的内核资源 缺点一个进程的多个线程无法运行在不同的 CPU 上 2完全由内核调度 M:N 1:1与上述优缺点互换 3双层调度结合了前两种方式的优点 2.1 线程库 Linux 下目前基本使用的都是 NPTL采用 1:1 方式实现的 2.2 创建和结束线程 1 #include pthread.h // 成功返回 0失败返回错误码 int pthread_create( pthread_t* thread, const pthread_attr_t* attr,void* (*start_routine)( void* ), void* arg );thread 的类型 pthread_t 是无符号长整形为新线程的标识符 attr 设置新线程的属性设为 NULL 代表使用默认线程属性 一个用户可打开的线程数量不能超过 RLIMIT_NPROC 限制 2在结束时最好调用如下函数 void pthread_exit( void* retval );retval 向线程的回收者传递其退出信息 3等待其他线程结束回收 int pthread_join( pthread_t thread, void** retval );会一直阻塞直到被回收的线程结束 成功返回 0失败返回错误码 错误码描述EDEADLK可能引起死锁比如两个线程互相针对对方调用 pthread_join 或 线程对自身调用 pthread_joinEINVAL目标线程不可回收或已经有其他线程在回收该目标线程ESRCH目标线程不存在 4异常终止一个线程 int pthread_cancel( pthread_t thread );接收到这个请求的目标线程可以决定是否允许被取消以及如何取消 int pthread_setcancelstate( int state, int* oldstate ); int pthread_setcanceltype( int type, int* oldtype );第一个参数分别用于设置线程的取消状态是否允许取消和取消类型如何取消 第二个参数记录了原来的状态和类型 state 可选值为 PTHREAD_CANCEL_ENABLE允许线程被取消线程创建时的默认状态PTHREAD_CANCEL_DISABLE禁止线程被取消如果收到取消请求会将请求挂起直到该线程允许被取消 type 可选值为 PTHREAD_CANCEL_ASYNCHRONOUS线程随时都可以被取消接收到取消请求立即采取行动PTHREAD_CANCEL_DEFERRED允许目标线程推迟行动直到调用了下面几个取消点函数中的一个pthread_join、pthread_testcancel、pthread_cond_wait、pthread_cond_timedwait、sem_wait 和 sigwait 2.3 线程属性 各种线程属性全部包含在一个字符数组中 #include bits/pthreadtypes.h #define __SIZEOF_PTHREAD_ATTR_T 36 typedef union {char __size[__SIZEOF_PTHREAD_ATTR_T];long int __align; } pthread_attr_t;// 初始化线程属性对象 int pthread_attr_init( pthread_attr_t* attr ); // 销毁线程属性对象被销毁的对象只有再次初始化之后才能继续使用 int pthread_attr_destroy( pthread_attr_t* attr ); // 获取或设置线程属性对象的某个属性 int pthread_attr_getdetachstate( const pthread_attr_t* attr, int* detachstate ); int pthread_attr_setdetachstate( pthread_attr_t* attr, int detachstate ); int pthread_attr_getstackaddr( const pthread_attr_t* attr, void** stackaddr ); int pthread_attr_setstackaddr( pthread_attr_t* attr, void* stackaddr ); int pthread_attr_getstacksize( const pthread_attr_t* attr, size_t* stacksize ); int pthread_attr_setstacksize( pthread_attr_t* attr, size_t stacksize ); int pthread_attr_getstack( const pthread_attr_t* attr, void** stackaddr, size_t* stacksize ); int pthread_attr_setstack( pthread_attr_t* attr, void* stackaddr, size_t stacksize ); int pthread_attr_getguardsize( const pthread_attr_t* attr, size_t* guardsize); int pthread_attr_setguardsize( pthread_attr_t* attr, size_t guardsize); int pthread_attr_getschedparam( const pthread_attr_t* attr, struct sched_param* param ); int pthread_attr_setschedparam( pthread_attr_t* attr, const struct sched_param* param ); int pthread_attr_getschedpolicy( const pthread_attr_t* attr, int* policy ); int pthread_attr_setschedpolicy( pthread_attr_t* attr, int policy ); int pthread_attr_getinheritsched( const pthread_attr_t* attr, int* inherit); int pthread_attr_setinheritsched( pthread_attr_t* attr, int inherit ); int pthread_attr_getscope( const pthread_attr_t* attr, int* scope ); int pthread_attr_setscope( pthread_attr_t* attr, int scope );detachstate线程的脱离状态 PTHREAD_CREATE_JOINABLE可被回收默认值PTHREAD_CREATE_DETACH脱离线程退出时自行释放资源 stackaddr 和 stacksize线程堆栈的起始地址和大小一般由系统自动管理guardsize保护区域大小如果大于 0系统创建线程时会在其堆栈的尾部额外分配 guardsize 字节空间作为保护堆栈不被错误地覆盖的区域如果通过 pthread_attr_setstackaddr或pthread_attr_setstack手动设置线程的堆栈会忽略该属性schedparam线程调度参数该结构体目前只有一个整性类型成员 sched_priority表示线程运行优先级schedpolicy线程调度策略 SCHED_FIFO先进先出调度SCHED_RR轮转算法调度这两种调度算法都具备实时调度功能只能用于以超级用户身份运行的进程SCHED_OTHER 默认值 inheritsched是否继承调用线程的调度属性PTHREAD_INHERIT_SCHED 和 PTHREAD_EXPLICIT_SCHED前者表示沿用其创建者的线程调度参数这种情况下再设置新线程的调度参数将没有任何效果后者表明需要为新线程设定新的调度参数scope线程间竞争 CPU 的范围即线程优先级的有效范围目前 Linux 只支持 PTHREAD_SCOPE_SYSTEM 表明与系统中所有线程一起竞争 CPU 的使用 2.4 POSIX 信号量
http://wiki.neutronadmin.com/news/418973/

相关文章:

  • 更改wordpress主题字体宁波seo哪家好快速推广
  • 山东网站集约化建设十大软件排行榜
  • 静态页面网站关键词权重
  • 网站代码上传到服务器后要怎么做的凡科建站是什么
  • 做网站多少做网站好的框架
  • 电子商务网站建设期末试题建设一个网站需要哪些知识
  • 网站开发设计参考文献贵阳能做网站的公司有哪些
  • pageadmin做网站要钱吗盐城网站开发公司电话
  • 北京公司如何做网站咨询行业
  • 管理系统网站微信微网站模版
  • 制作网站民治买东西的网站
  • 购物网站的经营要素数字营销技术应用中级实训答案
  • php做企业网站中国在菲律宾做网站
  • 电子商务微网站制作wordpress底部版权插件
  • 铜川做网站的公司电话国网商旅网页地址
  • 为什么做旅游网站怎么重新设置wordpress
  • 制作哪个网站好菲纳斯wordpress
  • 关于网站建设申请长沙网站维护公司
  • 互联网站安全网页设计视频网站
  • 门户网站的主要功能应用公园免费版下载
  • 分类信息网站开发教程长沙网络营销类岗位
  • 做网站技术好学嘛福州网络营销推广产品优化
  • 美食类网站开发说明书长沙做网站推荐
  • 网站存在的问题及改进措施烟台网站建设 制作 推广
  • 化工外贸网站建设企业怎么做自己的网站
  • 网站空间一定要买吗大学生兼职网站开发
  • 泉州免费做网站搜索引擎的设计与实现
  • wordpress 中国企业seo网址查询
  • 网站开发需求分析说明东莞厚街国际大酒店
  • 制作网站专业做学校网站的目的