在/proc/目录下,您将找到当前活动的每个进程列表,只需找到您的PID,所有相关数据都在那里。一个有趣的信息是文件夹fd/,您将找到进程当前打开的所有文件处理程序。
最终,您将在设备下找到一个符号链接(在/dev/甚至/proc/bus/usb/下),如果设备挂起,则链接将失效,无法刷新此句柄,进程必须关闭并重新打开它(即使重新连接)。
此代码可以读取您的PID链接当前状态。
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
int main() {
DIR *d;
int maxpathlength=256;
char path[maxpathlength];
sprintf(path,"/proc/%i/fd/",getpid() );
printf("List of %s:\n",path);
struct dirent *dir;
d = opendir(path);
if (d) {
while ((dir = readdir(d)) != NULL) {
if (dir->d_type == DT_LNK) {
const int maxlength = 256;
char hardfile[maxlength];
int len;
char tempath[maxlength];
sprintf(tempath,"%s%s",path,dir->d_name);
if ((len=readlink(tempath,hardfile,maxlength-1))!=-1) {
hardfile[len]='\0';
printf("%s -> %s\n", dir->d_name,hardfile);
} else
printf("error when executing readlink() on %s\n",tempath);
}
}
closedir(d);
}
return 0;
}
这段最终的代码很简单,你可以尝试使用linkat函数。
int
open_dir(char * path)
{
int fd;
path = strdup(path);
*strrchr(path, '/') = '\0';
fd = open(path, O_RDONLY | O_DIRECTORY);
free(path);
return fd;
}
int
main(int argc, char * argv[])
{
int odir, ndir;
char * ofile, * nfile;
int status;
if (argc != 3)
return 1;
odir = open_dir(argv[1]);
ofile = strrchr(argv[1], '/') + 1;
ndir = open_dir(argv[2]);
nfile = strrchr(argv[2], '/') + 1;
status = linkat(odir, ofile, ndir, nfile, AT_SYMLINK_FOLLOW);
if (status) {
perror("linkat failed");
}
return 0;
}