linuxC线程异常退出调查linuxc线程

作者&投稿:郯水 (若有异议请与网页底部的电邮联系)
~

Exceptioninthreadmain解决办法?

Java命令行执行的时候,会出这样的出错信息Exceptioninthreadmainjava.lang.NoclasSdeffounderror:应该这样检查你的环境和你的操作:

1、你的文件名对吗?JAVA要求你的文件和你的类名严格对应的。比如publicclassHelloword{..-那么文件名一定只能是Helloworld.java,看仔细了!

2、你的程序中有main方法马?参数什么的对吗?main方法的声明应该是这样子的:publicstaticVoidmain(Stringl们args)事实上如果你用开发工具来做的话,是不会错的。如果你用Ultraedit之类的来写程序的话,就一个字不要改的照抄吧!

3、记住,Javac后面跟的参数是文件名,但java后面跟的是类名!这是我开始学JAVA是犯的错,javaHelloworld,class,然后就报错。后来才弄明白,应该是avaHelloworld。

4、设置了classpath了吗?不仅是在安装JDK时要设置的内容,一般来说最好还要自己设置一个目录来存放自己的类文件的。比如d:NclassE目录。设置classpath=%classpath%;dclass-那么,现在将Helloworlc.class文件COPY到d:classE目录下,再javaHelloWorld应该就OK了。

5、结合第3点和第4点如果你的类是属于某一个包的,比如这样一个类sony.test.Helloworld,那么按照我在第4点中说的目录来说,就应该Helloworld,class文件存放到d:classsonytest目录下。

执行的时候应该参考第3点中说的,按类名执行:javasonytest,HelloWorld。明白了吗?一直我也想不出还会有什么理由造成这个出错信息了!如果有哪位兄弟想到了就补充一下吧!其实如果你使用了一些比较好的编程工具的话,根本就没有机会碰到这个错误的,至少我在使用了Visual/AgeforJava之后,就没有这样的事情了。好啦,不说了祝同志们好运吧!过了这第一道门,后面的就比较简单啦。

Linux多线程通信?

PIPE和FIFO用来实现进程间相互发送非常短小的、频率很高的消息;

这两种方式通常适用于两个进程间的通信。

共享内存用来实现进程间共享的、非常庞大的、读写操作频率很高的数据(配合信号量使用);

这种方式通常适用于多进程间通信。

其他考虑用socket。这里的“其他情况”,其实是今天主要会碰到的情况:

分布式开发。

在多进程、多线程、多模块所构成的今天最常见的分布式系统开发中,

socket是第一选择

。消息队列,现在建议不要使用了----因为找不到使用它们的理由。在实际中,我个人感觉,PIPE和FIFO可以偶尔使用下,共享内存都用的不多了。在效率上说,socket有包装数据和解包数据的过程,所以理论上来说socket是没有PIPE/FIFO快,不过现在计算机上真心不计较这么一点点速度损失的。你费劲纠结半天,不如我把socket设计好了,多插一块CPU来得更划算。另外,进程间通信的数据一般来说我们都会存入数据库的,这样万一某个进程突然死掉或者整个服务器死了,也不至于丢失重要数据、便于回滚到之前的状态。从这个角度考虑,适用共享内存的情况也更少了,所以socket使用得更多。再多说一点关于共享内存的:共享内存的效率确实高,但它的重点在“共享”二字上。如果的确有好些进程共享一大块数据(如果把每个进程都看做是类的对象的话,那么共享数据就是这个类的static数据成员),那么共享内存就是一个不二的选择了。但是在面向对象的今天,我们更多的时候是多线程+锁+线程间共享数据。因此共享进程在今天使用的也越来越少了。不过,在面对一些极度追求效率的需求时,共享内存就会成为唯一的选择,比如高频交易系统。除此以外,一般是不需要特意使用共享内存的。另外,

PIPE和共享内存是不能跨LAN的

(FIFO可以但FIFO只能用于两个进程通信)

如果你的分布式系统随着需求的增加而越来越大所以你想把不同的模块放在不同机器上而你之前开发的时候用了PIPE或者共享内存,那么你将不得不对代码进行大幅修改......同时,即使FIFO可以跨越LAN,其代码的可读性、易操作性和可移植性、适应性也远没有socket大。这也就是为什么一开始说socket是第一选择的原因。最后还有个信号简单说一下。

请注意,是信号,不是信号量。

信号量是用于同步线程间的对象的使用的(建议题主看我的答案,自认为比较通俗易懂:

semaphore和mutex的区别?-Linux-知乎

)。信号也是进程间通信的一种方式。比如在Linux系统下,一个进程正在执行时,你用键盘按Ctrl+c,就是给这个进程发送了一个信号。进程在捕捉到这个信号后会做相应的动作。虽然信号是可以自定义的,但这并不能改变信号的局限性:

不能跨LAN、信息量极其有限

。在现代的分布式系统中,通常都是

消息驱动:

即进程受到某个消息后,通过对消息的内容的分析然后做相应的动作。如果你把你的分布式系统设置成信号驱动的,这就表示你收到一个信号就要做一个动作而一个信号的本质其实就是一个数字而已。这样系统稍微大一点的话,系统将变得异常难以维护;甚至在很多时候,信号驱动是无法满足我们的需求的。因此现在我们一般也不用信号了。因此,请记住:

除非你有非常有说服力的理由,否则请用socket。

顺便给你推荐个基于socket的轻量级的消息库:ZeroMQ。

linux怎么指定线程库?

大概的介绍一下Linux的指定CPU运行,包括进程和线程。linux下的top命令是可以查看当前的cpu的运行状态,按1可以查看系统有多少个CPU,以及每个CPU的运行状态。可是如何查看线程的CPU呢?

top-Hppid,pid就是你当前程序的进程号,如果是多线程的话,是可以查看进程内所有线程的CPU和内存使用情况。

pstree可以查看主次线程,同样的pstree-ppid。可以查看进程的线程情况。

taskset这个其实才是重点,可以查看以及设置当前进程或线程运行的CPU(设置亲和力)。

taskset-pcpid,查看当前进程的cpu,当然有的时候不只是一个,taskset-pccpu_numpid,cpu_num就是设置的cpu。这样的话基本的命令和操作其实大家都知道了,接下来就是在代码中完成这些操作,并通过命令去验证代码的成功率。进程制定CPU运行:

viewplaincopy#include#include#include#include#include#define__USE_GNU#include#include#includeintmain(intargc,char*argv){//sysconf获取有几个CPUintnum=sysconf(_SC_NPROCESSORS_CONF);intcreated_thread=0;intmyid;inti;intj=0;//原理其实很简单,就是通过cpu_set_t进行位与操作cpu_set_tmask;cpu_set_tget;if(argc!=2){printf(usage:./cpunumn);exit(1);}myid=atoi(argv)

;printf(systemhas%iprocessor(s).n,num)

;//先进行清空,然后设置掩码CPU_ZERO(mask);CPU_SET(myid,mask)

;//设置进程的亲和力if(sched_setaffinity(0,sizeof(mask),mask)==-1){printf(warning:couldnotsetCPUaffinity,continuing...n);}while(1){CPU_ZERO(get);//获取当前进程的亲和力if(sched_getaffinity(0,sizeof(get),get)==-1){printf(warning:coundnotgetcpuaffinity,continuing...n);}for(i=0;inum;i++){if(CPU_ISSET(i,get)){printf(thisprocess%disrunningprocessor:%dn,getpid(),i);}}}return0;}进程设置CPU运行,其实只能是单线程。多线程设定CPU如下:

viewplaincopy#define_GNU_SOURCE#include#include#include#include#include#includevoid*myfun(void*arg){cpu_set_tmask;cpu_set_tget;charbuf;inti;intj;//同样的先去获取CPU的个数intnum=sysconf(_SC_NPROCESSORS_CONF);printf(systemhas%dprocessor(s)n,num);for(i=0;inum;i++){CPU_ZERO(mask);CPU_SET(i,mask);//这个其实和设置进程的亲和力基本是一样的if(pthread_setaffinity_np(pthread_self(),sizeof(mask),mask)0){fprintf(stderr,setthreadaffinityfailedn);}CPU_ZERO(get);if(pthread_getaffinity_np(pthread_self(),sizeof(get),get)0){fprintf(stderr,getthreadaffinityfailedn);}for(j=0;jnum;j++){if(CPU_ISSET(j,get)){printf(thread%disrunninginprocessor%dn,(int)pthread_self(),j);}}j=0;while(j++100000000){memset(buf,0,sizeof(buf));}}pthread_exit(NULL);}intmain(intargc,char*argv){pthread_ttid;if(pthread_create(tid,NULL,(void*)myfun,NULL)!=0){fprintf(stderr,threadcreatefailedn);return-1;}pthread_join(tid,NULL);return0;}

linux有没有线程id确认函数?

linuxC中,获取当前进程id函数为getpid();头文件:#include?函数原型:pid_t?getpid(void);函数说明:getpid?()用来取得目前进程的进程id,许多程序利用取到的此值来建立临时文件,?以避免临时文件相同带来的问题。返回值:目前进程的进程id范例#include?#include?main(){????printf(pid=%dn,?getpid());}执行:pid=1494?/*每次执行结果都不一定相同?*/




内黄县18946715203: Linux C程序异常退出怎么办 -
辕奋小儿: 在Linux上只要打开core dump文件开关,当程序crash时系统生成相应的core文件.下面是简单的一些步骤: 1.查看当前是否已经打开了此开关 通过命令:ulimit -c 如果输出为 0 ,则代表没有打开.如果为unlimited则已经打开了,就没必要在做打开. 2.

内黄县18946715203: linux中 子进程异常退出怎么重启子进程 -
辕奋小儿: 用父进程来监查,当子进程异常退出时,会发送SIGCHLD信号给父进程,父进程捕捉到信号后可以调用execl函数来重启这个程序

内黄县18946715203: 线程 "main" 中发生异常java.lang.NoClassDefFoundError: 请问这是什么问题(在linux运行安装程序) -
辕奋小儿: 安装目录少了install.jar 引发的异常,与ncsetup.bat 同目录

内黄县18946715203: linux 进程异常退出后pid文件会自动删除吗 -
辕奋小儿: 首先确认要删除的是什么文件,在Linux命令行界面下,所有的设备、文件、挂载等都显示类似于文件,确认不要删除错了. 如果确认是一个可删除的文件但是无法删除,那么可能是文件损坏,或者是一个无效的挂载文件都可能造成无法删除的情况,解决方法可以通过重启Linux系统,在重启时,如果是文件系统有问题,Linux会提示修复,按照界面的提示修复即可,如果是无效挂载造成

内黄县18946715203: linux 线程中断 出错 -
辕奋小儿: 出错是因为你的buff中内容的末尾没有'\0'吧.....recv会返回一个数好像是接收到数据的长度 int x=recv(.....); buff[x]='\0'; 这样试试..而且你是无线循环,在每次比较完buff后最好记得清空buff的内容...

内黄县18946715203: linux C网络编程调试出现错误,求大神指点 -
辕奋小儿: segment fault,一般就是要写不能访问的内存区域了这里的可能, 1. listenfd的值不对,负数或者太大 2. &allset的区域不让写

内黄县18946715203: linux gcc使用C++11的thread库,只有几行程序,出运行时异常 -
辕奋小儿: g++ -std=c++11 -pthread source.cpp -o bin_namelinux 下的 thread 是依赖 pthread 实现的. 所以链接时要加上,不然会运行出错. 贴一下你的你码吧,也许是其它错误.

内黄县18946715203: linux 程序异常退出,怎么删除消息队列 -
辕奋小儿: 我用的linux as4 的操作系统,重装了oracle数据库后,以前的老数据文件和里面的文件都不能删除,并且读写和执行的权限都赋权给了oracle和root这两个,删除时提示为只读系统文件,请高手指点如何修改文件,能给出相应的命令最好!msgrcv...

内黄县18946715203: linux下的C++异常(exception)该如何使用? -
辕奋小儿: 我在红帽9上编链执行如下程序: #include#includeint main () { try { std::exception e; throw e; }catch (std::exception e){ std::cout} 毫无问题..~ g++是version 3.2.2 2003~ 命令行是:g++ test.cc -o test ——不知道你那儿里..

内黄县18946715203: linux下c程序错误 -
辕奋小儿: /* */ 用在段落注释,一般是说明.如果你这种在函数的一行简短的注释,用 // 吧.这样,你再出现这种问题的机会就少多了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网