/ proc / 디렉토리에서 현재 활성화 된 모든 프로세스의 목록을 찾을 수 있으며 PID와 관련된 모든 데이터를 찾을 수 있습니다. interresting 정보는 폴더 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;
}