『壹』 linux中pid gid tgid tid的区别和联系
getpid : 取得process id,对于thread,就是取得线程对应进程的id;
对应的system call:
asmlinkage long sys_getpid(void)
1614 {
1615 return current->tgid;
1616 }
tgid = thread group id
/世返///////////////////////////散返迅/////////////////////////////////////////////
gettid:取冲此得线程id,如果是process,其实就等于getpid:
#define gettid() syscall(__NR_gettid)
对应的system call:
/* Thread ID - the internal kernel "pid" */
1761 asmlinkage long sys_gettid(void)
1762 {
1763 return current->pid;
1764 }
getgid:取得group id,就是user的group id
和用id命令得到的group id是一回事:
bash-3.1$ id
uid=3013(xxx) gid=300(xxxx) groups=300(xxxx),301(platform),505(fpgadrv),9022(gsm)
对于一个thread来说,在kenerl中可以看到他的process id(tgid),还可以看到他的thread id(pid)。
『贰』 如何用它在Linux的相对路径打开一个文件
1. 如果程序不是由自己做,这是一个糟糕的计划。糟糕的程序应包有一点的Bash脚本:#!/bin/bash
set -e
cd $(readlink -f $(dirname $0))
exec ./myprog $*
上面的脚本确定所在的目录,然后更改当前工作目录到该目录并运行一个程序myprog从那里,通过所有透明。你必须把这个脚本到你的程序所在的目录,然后运行你的程序来代替它。 假设您有访问源代码并可以修复程序,proc文件系统来确定程序的位置和绝对路径。 例如,/proc/self/exe将永远是一个符号链接指向的当前进程的二进制文件。使用readlink读取它的值 CodeGo.net,再切可执行文件和你得到的目录。
2. 出现了问题,前一段时间如何找到在C中的可执行文件的位置 你打开你的配置,资源,等这个路径..
3. 一种方法是ARGV [0]-有你的程序的相对路径(例如./programs/test/a.out)。如果你切的程序,并添加到文件的相对路径,你会得到一个怪物(例如./programs/test/../../input_data),但它应该工作。
4. 最简单的方法是要么把你的程序在一个预先知道的地方(/ bin中,/ usr / bin中,等)。如果没有,你在argv [0],删除该程序(最后一部分),作为你的工作目录前缀的所有相对路径(如果你想相对路径是相对于你的程序是)。 此外,你可以决定你的上面(使用的路径argv[0]),然后调用一个chdir()与此目录。从此所有的相对路径上是相对于所在的程序。但请注意,在这种情况下,你必须确定是否argv[0]占据绝对路径。如果没有,你必须得到当前工作目录(getcwd()),然后追加的目录部分argv[0]。但是,请注意,改变当前工作目录。是不是一个好主意,通常情况下,仿佛给你一个文件路径作为这将是相对于当前的工作目录,而不是相对于所在的程序存储。 例子:想象一下,你的程序在生活/usr/bin。你可以打电话给你的程序为:/usr/bin/myprog
(这将是argv[0]。trim的可执行文件,你有你的目录。)或者,是,比方说,在/usr:./bin/myprog
现在,argv[0]是一个相对路径。你必须在前面加上当前工作目录(/usr)到一个在argv[0]:/usr/./bin/myprog,然后再次trim可执行文件的目录将再次/usr/bin。
5. 唐的相对路径。使用绝对路径。你可能有一个config.h头文件中定义的常量,指定安装的可执行文件。然后,前置一个字符串常量到您在代码中指定任何相对路径。
6. openat打开相对于你传递一个特定的目录文件描述符的文件,但我不认为这真的是你想要的(精确)什么。 你将需要找到当前可执行文件的目录,然后创建一个开放的呼叫相对于(使用字符串运算符来建立路径,openat,或改变当前目录到该目录)。 为了找到可执行文件,可以readlink/proc/self/exe。readlink读取路径的符号链接指向,并/proc/self是一个符号链接/proc/<PID>哪里<PID>是当前进程(在内核中处理特殊)的进程ID,以及exe以下是该进程的可执行文件的符号链接。然后,你需要掏钱的路径的可执行文件,。 所有这一切都这么说,应该避免这样一种方式,他们希望找到相对于其可执行文件的东西写程序。
7. 好吧,如果你的程序需要从依赖安装程序所在的位置打开一个文件时,你应该做这个选项。有你的编译系统设置的CPP宏表示,其中有问题的数据文件,可以发现该目录。这是什么样的-datadir的选项在标准配置“的configure,make,make install的”内置程序经常做。 当然,如果你真的想要,可以通过编程改变工作目录与chdirPOSIX函数。但就像我说的,如果一个程序需要知道它位于何处,这应该是提供那么你不需要重写的选择工作目录中。
8. 您可以从确定执行路径argv[0]但这样做的时候要小心。 你所描述的是一个众所周知的和预期的语义。用户expect这种行为。
9. 下面是代码,你要找到你的程序在你的安装路径(与你的程序替换“test0002”):#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <unistd.h>
///=============================================================================
std::string FindInstallPath()
{
std::string sret="";
int pid = (int)getpid();
bool b=false;
std::string sf, s;
std::stringstream ss;
ss << "/proc/" << pid << "/maps";
sf = ss.str();
std::ifstream ifs(sf.c_str());
size_t pos1, pos2;
while (!b && ifs.good())
{
std::getline(ifs, s);
if ((pos1 = s.rfind("test0002")) != std::string::npos)
{
if ((pos2 = s.find_first_of('/')) != std::string::npos)
sret = s.substr(pos2, pos1 - pos2);
b = true;
}
}
if (!b) sret = "";
ifs.close();
return sret;
}
『叁』 如何获取linux内核线程的pid
通过查看资料,发现一种比较简单的方法就是在代码中使用printf将当前线程的id打印出来。
而这也分成两种情况:
1. 如果是pthread,则使用,
#include <pthread.h>
pthread_t pthread_self(void);
2. 如果不是pthread,即是由内核创建的线程,则使用,
#include <sys/types.h>
pid_t gettid(void);
获取线程所在的进程的id,方法如下:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
所以,我们在代码中使用如下的语句打印:
printf("\ntid=%lu, pid=%lu\n", gettid(), getpid());
这样就能获取当前代码所在的线程和进程了。
根据打印出来的进程的pid,获取进程名的方法是:
ls -lh /proc/pid/exe
lrwxrwxrwx 1 root root 0 Jan 1 20:48 /proc/pid/exe -> ...
sh-3.2#
查看thread id的方法有:
1. sh-3.2# ps -efL | grep process,
ps命令指定-L命令选项可以用来查看进程下所包含的所有线程。
2. sh-3.2# ls -l /proc/pid/task/
查看进程下当前有哪些task,这些task指的就是线程。
『肆』 linux里面的wait和waitpid是什么
wait和waitpid的不同在于wait会令调用者阻塞直至某个子进程终止而waitpid则可以通过设置一个选项来设置为非阻塞,另外waitpid并不是等待第一个结束的进程而是等待参数中pid指定的进程。
waitpid提供了wait所没有的三个特性:
1 waitpid使我们可以等待指定的进程
2 waitpid提供了一个无阻塞的wait
3 waitpid支持工作控制
具体可以查看APUE page202
『伍』 linux下getpid()的返回值问题
什么编译器?gcc4.1.2是一样的。
另外你中间有什么操作,父进程会成为孤儿进程挂在1上。
『陆』 linux 获取进程id 函数
linux C中,获取当前进程抄id 函数为getpid() ;
头文件:#include<unistd.h>
函数原型:pid_tgetpid(void);
函数说明:getpid()用来取得目前进程的进程id,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。
返回值:目前进程的进程id
范例
#include<stdio.h>
#include<unistd.h>
main()
{
printf("pid=%d ",getpid());
}
执行:
pid=1494/*每次执行结果都不一定相同*/