C语言_文件_进程常用函数/命令 + 实例

 文件相关命令:

ps -aux|grep init?      //搜索包含init名称的进程
top                     //linux下的资源管理器(动态)

//open 返回的int 是给后面的读/写/光标移动 用的fd,没有open就不能进行后面的操作;
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
close(fd); //关闭文件

// _t 都是返回的int数字;写write,读read,光标移动lseek
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
off_t lseek(int fd, off_t offset, int whence);

//同时打开两个文件
vimdiff demo1.c demo2.c 

//fopen注意mode就行,有:r r+ w w+ a ,返回的文件指针是给后面的读 写 偏移用
FILE *fopen(const char *pathname, const char *mode);
fclose(FILE *); //关闭文件

//跟上面的差不多一样用
//fread/fwrite(读写的数组,读写的大小,  读写的最大次数?, 读写的文件指针)
                (读写返回次数的区别:读为有效次数,能一次读完就算你写10次,也返回只读1次)
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
int fseek(FILE *stream, long offset, int whence);

fputc();//写入一个字符;
fgetc();//读取一个字符
feof();/检测是否到达文件末尾,到了返回1;文件结束符为EOF=-1;

//注意:读写操作都会使光标偏移,但也可以利用这点来遍历读写文件;
例:
while(!feof(FILE* fd)){
    printf("%c  ",fgetc(FILE* fd));
}

进程相关命令:

getpid(); fork(); vfork();


//_t 一律返回的是int
//获取进程ID 就是pid
pid_t getpid(void);

//fork创建子进程
pid_t fork(void);
//这里返回的是的pid = 0 就是子进程,pid > 0 就是父进程;
//所以可以通过判断pid的值,来区别父子进程需要执行的代码;
//注意fork开辟的子进程,没有等待一说,父子进程谁抢到就先运行谁,
//【子进程为僵尸进程】;
//例:

#include
#include 
#include 
#include 
int main()
{
        pid_t pid;

        int num = 0;
        pid = getpid();
        printf("this pid:%d\n",getpid());


        pid_t return_pid = fork();

        if(return_pid > 0){
                while(1){
                printf("this father pid:%d return_pid:%d \n",getpid(),return_pid);
                printf("father now num:%d\n",num);
                sleep(1);
                }

        }else if(return_pid == 0){

                printf("this son pid:%d return_pid:%d \n",getpid(),return_pid);
                num += 2;
                printf("child now num:%d\n",num);
                exit(6);
        }
}

//vfork创建子进程
pid_t vfork(void);
//注意fork开辟的子进程,会等待子进程执行完并exit(num)后,父子进程才继续执行,
//【子进程不会成为僵尸进程】;
//例:

#include
#include 
#include 
#include 
int main()
{
        pid_t pid;
        pid = getpid();
        printf("this pid:%d\n",getpid());
        int num = 0;
        printf("start_father_num:%d \n",num);
        pid_t return_pid = vfork();
        if(return_pid > 0){
                while(1){
                        printf("this father pid:%d return_pid:%d \n",getpid(),return_pid);
                        printf("num = %d\n",num);
                        sleep(1);
                }
        }
        else if(return_pid == 0){
                int i;
                for(i=0;i<3;i++){
                        printf("this son pid:%d return_pid:%d \n",getpid(),return_pid);
                        num++;
                        sleep(1);
                }
                exit(0);
        }
        return 0;
}

exit(6);wait(status); WEXITSTATUS(status); 

//wait() 返回的是子进程的ID 即pid;
//里面的 int *status 是子进程的exit(num)的num码;
//后续使用WEXITSTATUS(status),即可打印出来子进程退出时的状态码;
pid_t wait(int *status);
//例:

#include 
#include 
#include 
#include 
int main()
{
        pid_t pid;
        int status = 0;
        pid = getpid();
        printf("start father pid:%d\n",getpid());
        pid_t return_pid = fork();
        if(return_pid > 0 ){
                pid_t child_pid = wait(&status);
                printf("\n\nwait_return_childe_pid:%d\n",child_pid);
                printf("child exit code:%d \n",WEXITSTATUS(status));
                while(1){
                printf("this father pid:%d fork_return_pid:%d > 0  \n",getpid(),return_pid);
                sleep(1);
                }
                }else if(return_pid == 0){
                        int i;
                        for(i=0;i<3;i++){
                                printf("this son pid:%d fork_return_pid:%d == 0 \n",getpid(),return_pid);
                        }
                        exit (6);
                }



        return 0;
}

exec组函数 对比 system + popen :

大佬精彩博文: https://blog.csdn.net/u014530704/article/details/73848573

观后感:

跟着execl/execlp指定的程序跑了,不回来了!

    //  date 获取时间的程序
    execl("./PATH","date","NULL");
    //  execl(程序所在路径,程序名,结尾必须为NULL)
    //  就像这样用,在当前程序运行到这句代码时,
    //  便将替换为后续执行execl所指的程序,不带回头的那种!

    execlp("date","date",NULL);
    //  execlp(程序名,程序名,结尾必须为NULL)
    //  就像这样用,它带p,能自己在环境变量下搜索对应的程序并替换后续执行;
    //  也是不带回头的那种!

相比较之下 system 执行完指定程序后,还会回来,挺好!

    system("cat demo1.c");
    //执行完成后返回原程序,继续执行后续代码;

而对比popen 而言,popen除了将指定程序/代码执行完之后,继续执行后续代码外,还将读/写的内容放在管道内,并以文件指针的形式返回;

#include 
#include 
int main()
{
        printf("------------------------------------------------\nPS:\n");

        char* p = "ps";
        FILE *fd = popen(p,"r");
        char data[1024];
        fread(&data,1024,1,fd);
        printf("%s\n",data);
        perror("why");
        return 0;
}

你可能感兴趣的:(c语言,开发语言)