ภายใต้ไดเรกทอรี / proc / คุณจะพบรายการของทุกกระบวนการที่ใช้งานอยู่ในปัจจุบันเพียงแค่ค้นหา PID ของคุณและข้อมูลทั้งหมดที่เกี่ยวข้องอยู่ที่นั่น ข้อมูลที่ขัดจังหวะคือโฟลเดอร์ fd / คุณจะพบตัวจัดการไฟล์ทั้งหมดที่เปิดโดยกระบวนการนี้
ในที่สุดคุณจะพบลิงก์สัญลักษณ์ไปยังอุปกรณ์ของคุณ (ภายใต้ / dev / หรือแม้กระทั่ง / proc / bus / usb /) หากอุปกรณ์แฮงค์ลิงก์จะหยุดทำงานและจะไม่สามารถรีเฟรชแฮนเดิลนี้ได้กระบวนการจะต้องปิดและ เปิดอีกครั้ง (แม้จะมีการเชื่อมต่อใหม่)
รหัสนี้สามารถอ่านสถานะปัจจุบันของลิงค์ PID ของคุณ
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
int main() {
// the directory we are going to open
DIR *d;
// max length of strings
int maxpathlength=256;
// the buffer for the full path
char path[maxpathlength];
// /proc/PID/fs contains the list of the open file descriptors among the respective filenames
sprintf(path,"/proc/%i/fd/",getpid() );
printf("List of %s:\n",path);
struct dirent *dir;
d = opendir(path);
if (d) {
//loop for each file inside d
while ((dir = readdir(d)) != NULL) {
//let's check if it is a symbolic link
if (dir->d_type == DT_LNK) {
const int maxlength = 256;
//string returned by readlink()
char hardfile[maxlength];
//string length returned by readlink()
int len;
//tempath will contain the current filename among the fullpath
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;
}