linux下的C语言快速学习—进程和文件

1、进程的概念

这是操作系统课程里的一个概念 进程是一个开始执行但是还没有结束的程序的实例.就是可执行文件的具体实现. 一个程序可能有许多进程,而每一个进程又可以有许多子进程.依次循环下去,而产生子孙进程. 当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用.在系统里面只有进程没有程序,为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的身份证)以便识别. 为了充分的利用资源,系统还对进程区分了不同的状态.将进程分为新建,运行,阻塞,就绪和完成五个状态.
下面是进程的程序

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h> 
struct passwd { 
char *pw_name; /* 登录名称 */ 
char *pw_passwd; /* 登录口令 */ 
uid_t pw_uid; /* 用户ID */ 
gid_t pw_gid; /* 用户组ID */ 
char *pw_gecos; /* 用户的真名 */ 
char *pw_dir; /* 用户的目录 */ 
char *pw_shell; /* 用户的SHELL */ 
}; 
struct passwd *getpwuid(uid_t uid);

int main(int argc,char **argv) 
{ 
pid_t my_pid,parent_pid; 
uid_t my_uid,my_euid; 
gid_t my_gid,my_egid; 
struct passwd *my_info; 
my_pid=getpid(); /* 获取本进程的序号 */ 
parent_pid=getppid(); /*获取本进程父进程的编号*/
my_uid=getuid(); 
my_euid=geteuid(); 
my_gid=getgid(); 
my_egid=getegid(); 
my_info=getpwuid(my_uid); 
printf("Process ID:%ld\n",my_pid); 
printf("Parent ID:%ld\n",parent_pid); 
printf("User ID:%ld\n",my_uid); 
printf("Effective User ID:%ld\n",my_euid); 
printf("Group ID:%ld\n",my_gid); 
printf("Effective Group ID: %ld\n",my_egid);
if(my_info) 
{ 
printf("My Login Name:%s\n" ,my_info->pw_name); 
printf("My Password :%s\n" ,my_info->pw_passwd); 
printf("My User ID :%ld\n",my_info->pw_uid); 
printf("My Group ID :%ld\n",my_info->pw_gid); 
printf("My Real Name:%s\n" ,my_info->pw_gecos); 
printf("My Home Dir :%s\n", my_info->pw_dir); 
printf("My Work Shell:%s\n", my_info->pw_shell); 
}
} 

运行结果:

Process ID:2390
Parent ID:2100
User ID:1000
Effective User ID:1000
Group ID:1000
Effective Group ID: 1000
My Login Name:jerry
My Password :x
My User ID :1000
My Group ID :1000
My Real Name:Administrator,,,
My Home Dir :/home/jerry
My Work Shell:/bin/bash

关于创建创建进程(fork函数用法 )

#include "sys/types.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"

int main()
{
  pid_t pid;
  char *message;
  int n;
  pid=fork();
  if(pid<0)
  {
    perror("fork failed");exit(1);
  }
  else if(pid==0)
  {
    message="This is the child\n";n=6;
  }
  else
  {
      message="This is the parent\n";n=3;
  }
  for(;n>0;n--)
  {
    printf(message);
    sleep(1);
  }
  return 0;
}

在父进程创建子进程(fork)以后,程序有两个进程,如果是父进程就会连续输出3次This is the parent,如果是子进程连续输出6次This is the child,但是在执行的时候不是这样的,执行结果如下;

jerry@ubuntu:~/linux/jincheng1$ ./a.out
This is the parent
This is the child
This is the parent
This is the child
This is the parent
This is the child
This is the child
jerry@ubuntu:~/linux/jincheng1$ This is the child
This is the child
这是因为在循环输出是有这句代码sleep(1),在循环输出时会睡眠1秒,1秒是非常长的时间,子进程很有可能被调度到。同样地,子进程每打印一条消息就睡眠1秒,在这1秒期间父进程也很有可能被调度到。所以程序运行的结果基本上是父子进程交替打印。但这不是一定的,这取决与系统中其他进程的运行情况和内核调度算法。

简单的IO重定向操作

实现小写转化为大写的操作

#include "ctype.h"
#include "stdio.h"

int main(void)
{
  int ch;
  while((ch=getchar())!=EOF)
  {
    putchar(toupper(ch));
  }
  return 0;
}

编译以后

使用shell进行进行重定向
jerry@ubuntu:~/linux/jincheng1$ ./a.out < file.text
HELLO WORD!

2、文件操作

文件复制简单实例

#include <unistd.h> 
#include <fcntl.h> 
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h> 
#include <string.h> 
#define BUFFER_SIZE 1024

int main(int argc,char **argv)
{
   int from_fd,to_fd;
   int bytes_read,bytes_write;
   char buffer[BUFFER_SIZE]; 
   char *ptr; 
   if(argc!=3) 
   { 
         fprintf(stderr,"Usage:%s fromfile tofile\n\a",argv[0]); 
         exit(1); 
   }
    /* 打开源文件 */ 
   if((from_fd=open(argv[1],O_RDONLY))==-1) 
   { 
          fprintf(stderr,"Open %s Error:%s\n",argv[1],strerror(errno)); 
          exit(1); 
    } 
     /* 创建目的文件 */ 
    if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) 
    { 
           fprintf(stderr,"Open %s Error:%s\n",argv[2],strerror(errno)); 
           exit(1); 
    }
    while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
    {
        /*当发生致命的操作时*/
        if((bytes_read==-1)&&(errno!=EINTR))break;
        else if(bytes_read>0)
        {
           ptr=buffer;
           while(bytes_write=write(to_fd,ptr,bytes_read))
           {
              /*一个致命错误发生了*/
              if((bytes_write==-1)&&(errno!=EINTR))break; 
              else if(bytes_write==bytes_read) break; 
              else if(bytes_write>0) 
              {
                ptr+=bytes_write;
                bytes_read-=bytes_write;
              }
           }
           if(bytes_write==-1)break; 
        }
    }
    close(from_fd); 
    close(to_fd); 
    exit(0);     
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Linux 下编写 C 语言程序需要一个编译器,如 GCC。可以使用命令行工具编写代码,并使用 GCC 编译器编译代码。例如,在命令行中输入 "gcc -o programname programname.c" 可以将 programname.c 文件编译为可执行文件 programname。然后在命令行运行 "./programname" 即可运行编译后的程序。 ### 回答2: LinuxC语言编程是非常常见的一种开发环境与方式。Linux操作系统提供了完善的C语言开发工具链,包括编译器、调试工具、开发库等,因此在Linux下进行C语言编程是非常方便和高效的。 首先,Linux下最常用的C语言编译器是GNU编译器套装(GCC)。GCC是一个开源的编译器套件,支持多种编程语言,其中包括C语言。使用GCC编译器,可以将C语言源代码编译成可执行的机器代码,从而在Linux操作系统上运行。 其次,Linux提供了丰富的调试工具,如GNU调试器(GDB)。GDB是一个功能强大的调试工具,可以通过设置断点、查看变量值、跟踪程序执行流程来帮助开发人员进行代码调试。使用GDB可以快速定位并解决代码中的错误。 此外,Linux还提供了大量的开发库和工具,如标准C库(libc)、各种系统库和第三方库等。这些库和工具能够极大地提升C语言编程的效率和功能,开发人员可以利用这些库来实现各种功能,如文件操作、网络通信、图形界面等。 在Linux下进行C语言编程还有一个显著的优势就是开源社区的支持。Linux有庞大的开源社区,有着丰富的资源和经验,开发人员可以从中获取帮助和学习。在开源社区中,开发人员可以共享自己的代码、学习他人的经验,并且可以参与到各种开源项目中去,提升自己的技能和知识。 综上所述,LinuxC语言编程是非常强大和便利的。通过Linux提供的工具链、库和开源社区的支持,开发人员可以高效地进行C语言编程,实现各种功能和项目。 ### 回答3: Linux下的C语言编程是一种广泛应用的编程方式。Linux作为一种开源操作系统,在C语言编程方面具有许多优势和特点。 首先,Linux下的C语言编程可以充分利用Linux操作系统的强大功能和丰富的系统接口。通过使用Linux的系统调用接口,我们可以直接对文件进程、网络等进行操作,实现更高级的功能。同时,Linux提供了许多方便的开发工具和库,比如GCC编译器、C库,使得C语言编程更加方便和高效。 其次,Linux下的C语言编程具有良好的可移植性。由于Linux操作系统的开源性质,C语言编程在Linux下编写的程序可以在其他操作系统上进行移植。这为开发者提供了更大的自由度和灵活性,使得他们能够更好地跨平台开发和移植应用程序。 另外,Linux下的C语言编程也提供了强大的调试和性能优化工具。开发者可以使用诸如gdb、valgrind等工具对C程序进行调试和性能分析,以找出潜在的问题并提高程序的效率。这些工具的存在大大提高了开发者对程序的控制和管理能力。 总结而言,Linux下的C语言编程是一种功能强大、可移植性高且开发工具丰富的编程方式。通过利用Linux操作系统的强大功能和丰富接口,开发者可以编写高效、稳定且可移植的应用程序。这使得Linux下的C语言编程成为了许多开发者的首选。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值