دستور tty(1) نام و آدرسِ فایل مربوط به ترمینال فعلی که در حال استفاده از آن هستیم را برمی‌گرداند. بدیهی است که دستور موجود در سیستم‌های لینوکس قطعا جزئیات بسیار بیشتری دارد. این برنامه صرفا به قصد تمرین و یادگیری نوشته شده است و حالت پیش فرض آن را پیاده می‌کند:

tty.c
/*
 * PRACTICE OF PROGRAMMING!
 * tty(1) simulation
 * 
 * safari.tafreshi@gmail.com
 * dokaj.ir
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <err.h>
#include <dirent.h>
#include <sys/stat.h>
#include <limits.h>
#include <sys/sysmacros.h>

void
search(char *dir, int minor, int major) {
    char path[PATH_MAX];
    DIR *dirp;
    struct dirent *dirent;
    int s;
    struct stat st;

    dirp = opendir(dir);
    if (dirp == NULL)
        err(EXIT_FAILURE, "opendir");

    while ((dirent = readdir(dirp)) != NULL) {
        sprintf(path, "%s/%s", dir, dirent->d_name);
        s = lstat(path, &st);
        if (s == -1)
            err(EXIT_FAILURE, "lstat");
        if (minor(st.st_rdev) == minor &&  major(st.st_rdev) == major) {
            printf("%s\n", path);
            exit(EXIT_SUCCESS);
        }
    }

    closedir(dirp);
}

int
main(int argc, char *argv[])
{
    struct stat st;
    int s, minor, major;
    char *dirs[] = {"/dev", "/dev/pts", NULL};

    s = fstat(STDIN_FILENO, &st);
    if (s == -1)
        err(EXIT_FAILURE, "fstat");

    minor = minor(st.st_rdev);
    major = major(st.st_rdev);

    for (int i = 0; dirs[i] != NULL; i++)
        search(dirs[i], minor, major);

    exit(EXIT_FAILURE);
}

برنامه به صورت زیر کامپایل و اجرا می‌شود:

SHELL
$ gcc -o tty tty.c
$ ./tty
/dev/pts/1
نوشته شده در: 1402-02-18 (1 سال 6 ماه 1 هفته پیش)

من محسن هستم؛ برنامه‌نویس سابق PHP و Laravel و Zend Framework و پایتون و فلسک. تمرکزم بیشتر روی لاراول بود! الان از صفر مشغول مطالعات اقتصادی هستم.

برای ارتباط با من یا در همین سایت کامنت بگذارید و یا به dokaj.ir(at)gmail.com ایمیل بزنید.

در مورد این مطلب یادداشتی بنویسید.