ubuntu fork(ubuntu sudo)
大家好,如果您还对ubuntu fork不太了解,没有关系,今天就由本站为大家分享ubuntu fork的知识,包括ubuntu sudo的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
在ubuntu中fork创键多进程后提示符不返回怎么回事
是有点怪,我在7.2下都能看到。但是9.0下不一定了,我有个程序,有两个线程,在9.0下运行的,从来只能看到一个进程,照例来说,在7.2下面应该能看到3个线程在运行的。对了你还可以在fork后,加个printf语句来判断你的子进程有没有执行。ps-aux不一定能看到所有进程,看到的不一定很top出来的一样,可pstree不加printf也可以看到10个fork出来的进程,pstree-p可以看具体进程号。一目了然
如何在ubuntu下使用Github
1、Git的安装
我使用了ubuntu 10.04,默认情况下,ubuntu中并没有安装,所以首先需要在系统中进行 git的安装。
sudo apt-get install git-core
安装完成后,在终端中输入 git就可以看到相关的命令了。如果只是需要使用git来管理本地的代码,那么现在就可以使用了。如果需要和github上的项目结合,还需要做其他的一些操作。
2、github帐号的申请
如果只是需要将github上感兴趣的代码拷贝到本地,自己进行修改使用,而不打算共享发布的话,其实不申请帐号也没有关系,只需要 git clone代码到本地就可以了。本文对这种方法不做讨论,毕竟使用 github就是为了开源的目的。
首先去 github.com上注册一个帐号,具体的注册流程就不赘述了。
3、在本地建立一个文件夹,然后做一些全局变量的初始化
git config--global user.name="用户名或者用户ID"
git config--global user.email="邮箱"
这两个选项会在以后的使用过程中自动添加到代码中。
4、创建验证用的公钥
这个是比较复杂和困扰大多数人的地方,因为 git是通过 ssh的方式访问资源库的,所以需要在本地创建验证用的文件。
使用命令:ssh-keygen-C'you email address@gmail.com'-t rsa
会在用户目录~/.ssh/下建立相应的密钥文件
可以使用 ssh-v git@github.com命令来测试链接是否畅通
5、上传公钥
在 github.com的界面中选择右上角的 Account Settings,然后选择 SSH Public Keys,选择新加。
Title可以随便命名,Key的内容拷贝自~/.ssh/id_rsa.pub中的内容,完成后,可以再使用 ssh-v git@github.com进行测试。看到下面的信息表示验证成功。
进行到这里,我们也可以利用github来管理我们的项目和参与开源工作了,大体上使用git分为三种方式。
管理自己的项目
这种情况是自己在本地有一些代码,需要利用 github来管理自己的项目,可以按照下面的步骤进行。
1、建立仓库
在需要建立项目的文件夹中,使用 git init进行仓库的建立。完成后,可以看到文件家中多了一个.git隐藏目录。
2、添加文件
使用 git add.来进行初始文件的添加。这里.表示将文件夹下所有的文件都添加进去,我们也可以指定文件进行添加。
3、提交文件
使用 git-m commit-m'comment'提交,可以将编辑的内容进行提交。
通过 git show可以看到项目的一些状态。
这是代码已经在本地管理了,但是本地管理完全体现不出git的优势。
利用github托管自己的项目
1、如果需要将自己的项目托管在github.com上,首先需要创建项目。在 Dashboard中选择 Create New Repository,填入相关信息后,项目就创建成功了。
2、之后,会有一个如何上传的提示,如下图已经很详细了。
Fork别人的项目
前面提到过,如果只是下载使用别人的代码,通过 git clone就可以了,当然clone的前提是项目必须是public的,私有的项目是没办法的。如果需要参与,可以通过fork,然后合并的方式。
1、首先需要去自己感兴趣的项目中进行Fork,fork出自己的一份分支来。fork之后,一般可以看到一个ssh访问的地址。例如:git@github.com:cocowool/userguide.git
2、复制代码
使用 git clone git@github.com:cocowool/userguide.git userguide可以将代码复制到本地的 userguide文件夹中
3、进行自己的修改,完成后请求原作者合并
git pull person master
下面是一些比较有用的命令的介绍:
#创建一个版本库 git init#每次修改好了后,可以先将修改存入stage(快照/索引)中 git add<modified files>#修改了大量文件则使用下面这个命令批量存入 git add.#使用commit将快照/索引中的内容提交到版本库中 git commit-m"msg"#也可以将git add与git commit用一个指令完成 git commit-a-m"msg"#将本地的git档案与github(远程)上的同步 git push#将github(远程)的git档案与本地的同步(即更新本地端的repo) git pull#例如,pull指令其实包含了fetch(将变更复制回来)以及merge(合并)操作 git pull git://github.com/tom/test.git#另外版本控制系统的branch功能也很有意思,若同时修改bug,又要加入新功能,可以fork出一个branch:一个专门修bug,一个专门加入新功能,等到稳定后再merge合并 git branch bug_fix#建立branch,名为bug_fix git checkout bug_fix#切换到bug_fix git checkout master#切换到主要的repo git merge bug_fix#把bug_fix这个branch和现在的branch合并#若有remote的branch,想要查看并checkout git branch-r#查看远程branch git checkout-b bug_fix_local bug_fix_remote#把本地端切换为远程的bug_fix_remote branch并命名为bug_fix_local#还有其它可以查看repo状态的工具 git log#可以查看每次commit的改变 git diff#可以查看最近一次改变的内容,加上参数可以看其它的改变并互相比较 git show#可以看某次的变更#若想知道目前工作树的状态,可以输入 git status
ubuntu Linux怎么解决僵尸进程
Linux允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait()这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,它的终止代号将告诉父进程这个任务是否已成功地完成。
为了遵循这些设计原则,不允许 Linux内核在进程一终止后就丢弃包含在进程描述符字段中的数据。只有父进程发出了与被终止的进程相关的 wait()类系统调用之后,才允许这样做。这就是引入僵死状态的原因:尽管从技术上来说进程已死,但必须保存它的描述符,直到父进程得到通知。
如果一个进程已经终止,但是它的父进程尚未调用 wait()或 waitpid()对它进行清理,这时的进程状态称为僵死状态,处于僵死状态的进程称为僵尸进程(zombie process)。任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理了。
僵尸进程是如何产生的
在UNIX系统中,一个进程结束了,但是他的父进程没有等待(调用wait/ waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。
但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动 wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。
为了观察到僵尸进程,我们自己写一个不正常的程序,父进程 fork出子进程,子进程终止,而父进程既不终止也不调用 wait清理子进程:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
intmain(void)
{
inti= 100;
pid_t pid=fork();
if(pid< 0)
{
perror("fork failed.");
exit(1);
}
if(pid> 0)
{
printf("This is the parent process. My PID is%d.\n", getpid());
for(; i> 0; i--)
{
sleep(1);
}
}
elseif(pid== 0)
{
printf("This is the child process. My PID is:%d. My PPID is:%d.\n", getpid(), getppid());
}
return0;
}
把上面的代码保存到文件 zomprocdemo.c文件中,并执行下面的命令编译:
?
1
$ gcc zomprocdemo.c-o zomprocdemo
然后运行编译出来的 zomprocdemo程序:
?
1
$./zomprocdemo
请点击输入图片描述
此时子进程已经退出,但是父进程没有退出也没有通过 wait()调用处理子进程。我们使用 ps命令查看进程的状态:
请点击输入图片描述
上图红框中的大写字母"Z"说明 PID为 112712的进程此时处于僵死的状态。
让我们接着往下看!在结束 sleep后父进程退出。当父进程退出后,子进程会变成孤儿进程,此时它会被一个管理进程收养。在不同的系统中,这个管理进程不太一样,早期一般是 init进程,Ubuntu上是 upstart,还有近来的 Systemd。但是它们都完成相同的任务,就是 wiat()这些孤儿进程,并最终释放它们占用的系统进程表中的资源。这样,这些已经僵死的孤儿进程就彻底的被清除了。
僵尸进程的危害
在进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号 PID,退出状态 the termination status of the process,运行时间 the amount of CPU time taken by the process等)。直到父进程通过 wait/ waitpid来取时才释放。
如果进程不调用 wait/ waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。
如何处理僵尸进程
僵尸进程的产生是因为父进程没有 wait()子进程。所以如果我们自己写程序的话一定要在父进程中通过 wait()来避免僵尸进程的产生。
当系统中出现了僵尸进程时,我们是无法通过 kill命令把它清除掉的。但是我们可以杀死它的父进程,让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。
下面的 demo中,父进程通过 wait()等待子进程结束:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
intmain(void)
{
pid_t pid;
pid= fork();
if(pid< 0)
{
perror("fork failed");
exit(1);
}
if(pid== 0){
inti;
for(i= 3; i> 0; i--)
{
printf("This is the child\n");
sleep(1);
}
// exit with code 3 for test.
exit(3);
}
else
{
intstat_val;
wait(&stat_val);
if(WIFEXITED(stat_val))
{
printf("Child exited with code%d\n", WEXITSTATUS(stat_val));
}
}
return0;
}
demo中父进程不仅等待子进程结束,还通过 WEXITSTATUS宏取到了子进程的 exit code。